2016-01-20 46 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