2013-05-18 62 views
1

我不明白下面的行爲。 numpy數組通常可以通過索引訪問,所以[:,1]應該等同於[:] [1],或者我想。有人可以解釋爲什麼事實並非如此嗎?numpy array slicing uncpected results

>>> a = np.array([[1, 2, 3], [4, 5, 6]]) 
>>> a[:,1] 
array([2, 5]) 
>>> a[:][1] 
array([4, 5, 6]) 

謝謝!

回答

5

這兩種形式的索引是不一樣的。您應該使用[i, j]而不是[i][j]。即使在兩者都起作用的情況下,第一個也會更快(見this question)。

使用兩個索引[i][j]是兩個操作。它執行第一個索引,然後執行第一個操作的結果。 [:]只是返回整個數組,因此您的第一個數組相當於array[1]。由於只傳遞了一個索引,因此它假定引用第一維(行),所以這意味着「獲得第一行」。使用一個複合索引[i, j]是同時使用兩個索引條件的單個操作,因此array[:, 1]返回「所有行,第1列」。

1

[:]創建列表的副本...

所以這是基本相同

array[1] == array[:][1] 

其正確返回在這種情況下[4,5,6]

array[:,1]說返回第一列的確是[2,5]

例如

a = [ 
     [1,2,3], 
     [4,5,6] 
    ] 

,從而可以看到列0(a[:,0])將是[1,4]和柱2(a[:,2])將[3,6]

同時a[1]是指第1行(或[4,5,6]) 和a[0]將是0行(或[1,2,3])

+0

那麼,爲什麼在第一種情況下是不一樣的呢? [[,]]有不同的含義嗎? – James

+0

參見編輯...基本上'a [1]!= a [:,1]' –

0
>>> a = np.array([[1, 2, 3], [4, 5, 6]]) 
>>> a[:,1] 
array([2, 5]) 

您選擇第二維(矩陣的列),並取該維度中的元素1。同樣的方法,a[:,0]選擇第一列,這裏是array([1,4]),a[:,2]第三列。

如前所述,a[:]複製您的列表(是一個numpy數組或列表)。