Numpy索引行为

Numpy索引行为,numpy,indexing,Numpy,Indexing,我在理解多维数组的numpy索引时遇到了很多困难。在我正在使用的这个示例中,假设我有一个2D数组a,它是100x10。然后我有另一个数组B,它是一个100x11D数组,值在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(

我在理解多维数组的numpy索引时遇到了很多困难。在我正在使用的这个示例中,假设我有一个2D数组a,它是100x10。然后我有另一个数组B,它是一个100x11D数组,值在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时

但如果我这样做了

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

这就是我想要的。我很难理解这里的区别。在我看来,A[:,5]和A[range(A.shape[0]),5]应该返回相同的东西,但它不在这里。使用
与使用
range(sizeArray)
仅从[0:sizeArray]创建数组有何不同包含,使用索引?

让我们看一个简单的数组:

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
索引可能会令人困惑。但一个好的起点是这个页面:

可能重复相同的内容,但将
np.arange(a.shape[0])[:,None]
作为第一个索引。
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]])]