2015-12-01 242 views
1

在涉及矩陣操作的小型Python腳本的開發過程中,我越來越困惑,因此我啓動了一個shell來玩弄一個玩具示例,並更好地理解Numpy中的矩陣索引。Numpy中的矩陣索引

這是我做過什麼:

>>> import numpy as np 
>>> A = np.matrix([1,2,3]) 
>>> A 
matrix([[1, 2, 3]]) 
>>> A[0] 
matrix([[1, 2, 3]]) 
>>> A[0][0] 
matrix([[1, 2, 3]]) 
>>> A[0][0][0] 
matrix([[1, 2, 3]]) 
>>> A[0][0][0][0] 
matrix([[1, 2, 3]]) 

正如你可以想像,這有幫助我更好地瞭解在numpy的矩陣索引。這種行爲對於我想描述爲「自身的數組」的東西來說是有意義的,但是我懷疑任何在他們正確思想中的人都會選擇它作爲科學圖書館中矩陣的模型。

那麼,我得到的輸出的邏輯是什麼?爲什麼矩陣對象的第一個元素是它自己的? PS:我知道如何獲得矩陣的第一個條目。我感興趣的是這個設計決策背後的邏輯。

編輯:我不是問如何訪問矩陣元素,或爲什麼矩陣行像矩陣行爲。我在索引單個數字時要求定義矩陣的行爲。這是一個典型的數組操作,但是結果的行爲與您期望從數組中獲得的行爲完全不同。我想知道這是如何實施的,設計決策背後的邏輯是什麼。

+2

語法是A [DIM1,DIM2,...]。對於這種情況,爲了得到第一個元素,可以做A [0,0],第二個元素爲A [0,1],第三個元素爲A [0,2]。這是一個1 x 3矩陣。 – Gopala

+0

有沒有人真的讀過PS? – broncoAbierto

+2

「矩陣」類被硬編碼爲總是有兩個維度(即行和列)。這通過切片和索引操作來保存(除非您訪問單個元素,例如'A [0,0]')。順便說一下,對於大多數用途,'ndarray'類(即標準numpy數組)是首選;搜索'numpy array vs matrix'來尋找關於這個主題的大量討論。 –

回答

6

看形狀索引後:

In [295]: A=np.matrix([1,2,3]) 
In [296]: A.shape 
Out[296]: (1, 3) 
In [297]: A[0] 
Out[297]: matrix([[1, 2, 3]]) 
In [298]: A[0].shape 
Out[298]: (1, 3) 

這種行爲的關鍵在於np.matrix始終是2D。所以即使你選擇了一行(A[0,:]),結果仍然是2d,形狀(1,3)。所以你可以根據你的喜好儘可能地多串,並且沒有新的事情發生。

你想用A[0][0]完成什麼?與A[0,0]相同? 對於基數np.ndarray這些類是相同的。

請注意Python解釋器將索引翻譯爲__getitem__調用。

A.__getitem__(0).__getitem__(0) 
A.__getitem__((0,0)) 

[0][0]是2索引操作,而不是一個。所以第二個[0]的效果取決於第一個產生的效果。對於數組A[0,0]相當於A[0,:][0]。但是,對於一個矩陣,你需要做的:

In [299]: A[0,:][:,0] 
Out[299]: matrix([[1]]) # still 2d 

=============================

「自身陣列」,但我懷疑任何人在他們的正確思想中會選擇它作爲科學圖書館中的矩陣模型。

那麼,我得到的輸出的邏輯是什麼?爲什麼矩陣對象的第一個元素是它自己的?

此外,A [0 ,:]是不一樣的A [0]

在這些意見的光讓我提出一些澄清。

A[0]並不意味着'返回第一個元素'。這意味着沿第1軸選擇。對於表示第一項的1d數組。對於2d數組,它意味着第一行。對於ndarray這將是一個1d陣列,但對於matrix它是另一個matrix。因此對於二維數組或矩陣,A[i,:]A[i]是一樣的。

A[0]不只是自己回來。它返回一個新的矩陣。不同id

In [303]: id(A) 
Out[303]: 2994367932 
In [304]: id(A[0]) 
Out[304]:8 

可能具有相同的數據,形狀和長足的進步,但它是一個新的對象。它與許多行矩陣的ith行一樣獨特。

大部分獨特的matrix活動定義於:numpy/matrixlib/defmatrix.py。我打算建議查看matrix.__getitem__方法,但大部分操作都在np.ndarray.__getitem__中執行。

np.matrix類被添加到numpy爲老派MATLAB程序員的便利。 numpy數組可以有幾乎任何數量的維數,0,1,... MATLAB只允許2個,但2000年左右的版本將其推廣到2個或更多。

+0

我不明白這個行爲是一個矩陣總是爲2d的結果。此外,A [0 ,:]與A [0]不同(即使它們在這種情況下產生相同的結果),因此矩陣行是numpy眼睛中的矩陣的事實並不能解釋我發佈的行爲。然而,有趣的是,索引轉換爲__getitem__。看到實施可能會對此有所瞭解。我沒有得到的是爲什麼在類中實現數組操作,如果它的行爲不是數組的行爲。索引數組通常會返回除數組本身之外的其他內容。 – broncoAbierto

+1

我的編輯能讓事情變得更清楚嗎? – hpaulj

1

如果你想獲得第二列的值,請使用以下假設你有以下

>> A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) 

>> A.T[1] 
array([ 2, 6, 10])