我在理解多维数组的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)
有何不同,使用索引?
答案 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