Numpy索引行为

时间:2016-01-20 06:50:12

标签: numpy indexing

我在理解多维数组的numpy索引时遇到了很多麻烦。在我正在使用的这个例子中,假设我有一个2D数组A,即100x10。然后我有另一个数组B,它是一个100x1的1D数组,其值介于0-9之间(A的索引)。在MATLAB中,我会使用A(sub2ind(size(A), 1:size(A,1)', B)返回A的每一行,即存储在B的相应行中的索引处的值。

所以,作为一个测试用例,假设我有这个:

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,)

当我尝试使用B天真地(错误地)

进行A索引时
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]应该返回相同的东西,但它不在这里。 :与仅使用[0:sizeArray]创建数组的range(sizeArray)有何不同,使用索引?

1 个答案:

答案 0 :(得分: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]])

使用切片,我们可以按任意顺序(甚至重复)选择3列X。换句话说,取所有行,但选择列。

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