2016-01-20 64 views
1

我在理解多維數組的numpy索引時遇到了很多麻煩。在我正在使用的這個例子中,假設我有一個二維數組A,它是100x10。然後我有另一個數組B,它是一個0到9之間的100x1 1D值的數組(A的索引)。在MATLAB中,我會用A(sub2ind(size(A), 1:size(A,1)', B)來換取的每一行,存儲B的相應行中Numpy索引行爲

所以索引處的值,作爲一個測試案例,讓我們說我有這樣的:

A = np.random.rand(100,10) 
B = np.int32(np.floor(np.random.rand(100)*10)) 

如果我打印它們的形狀,我得到:

print A.shape returns (100L, 10L) 
print B.shape returns (100L,) 

當我嘗試指標分爲A採用B天真的(錯誤地)

Test1 = A[:,B] 
print Test1.shape returns (100L, 100L) 

但如果我做

Test2 = A[range(A.shape[0]),B] 
print Test2.shape returns (100L,) 

這就是我想要的。我無法理解這裏所做的區分。在我看來,A [:,5]和A [範圍(A.shape [0]),5]應該返回相同的東西,但它不在這裏。 :與使用range(sizeArray)有什麼不同,它只是從[0:sizeArray]中創建一個數組來使用索引?

+0

可能重複[改變numpy數組與索引數組](http://stackoverflow.com/questions/30379663/changing-numpy-array-with-array-of- index) – shx2

+0

嘗試使用'np.arange(A.shape [0])[:,None]'作爲第一個索引。 – hpaulj

回答

1

讓我們看一個簡單的數組:

In [654]: X=np.arange(12).reshape(3,4) 
In [655]: X 
Out[655]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

隨着我們可以挑選的X 3列切片,以任意順序(甚至多次)。換句話說,採取所有行,但選定的列。

In [656]: X[:,[3,2,1]] 
Out[656]: 
array([[ 3, 2, 1], 
     [ 7, 6, 5], 
     [11, 10, 9]]) 

相反,如果我用3個值的列表(或陣列),這對他們與列值,有效地選擇3個值,X[0,3],X[1,2],X[2,1]

In [657]: X[[0,1,2],[3,2,1]] 
Out[657]: array([3, 6, 9]) 

如果不是我給了它一個列向量索引行,我得到同樣的事情與切片:

In [659]: X[[[0],[1],[2]],[3,2,1]] 
Out[659]: 
array([[ 3, 2, 1], 
     [ 7, 6, 5], 
     [11, 10, 9]]) 

這相當於撿9周個人的價值觀,通過廣播的產生:

In [663]: np.broadcast_arrays(np.arange(3)[:,None],np.array([3,2,1])) 
Out[663]: 
[array([[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2]]), 
array([[3, 2, 1], 
     [3, 2, 1], 
     [3, 2, 1]])] 

numpy索引可能會引起混淆。但一個好的起點是這個頁面:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html