使用两个范围对象切片2级numpy数组

时间:2019-03-11 20:32:06

标签: matlab numpy matrix indexing octave

我有一个第二级数组,想使用切片对其进行索引。 如果在适当的位置创建切片,则会得到预期的结果:

A = rand(3,3)
assert(allclose(A[0:3, 0:3], A))

另一方面,如果我预先创建切片,则索引的行为不符合预期(至少从octave / matlab用户的角度来看,这两种方法均产生相同的结果):

A = rand(3,3)
i = range(0,3)
j = range(0,3)
assert(allclose(A[i, j], A))
# AssertionError

为什么这些方法产生不同的结果?

1 个答案:

答案 0 :(得分:0)

您为什么期望他们做同样的事情? numpy与MATLAB的索引不同。

In [6]: arr = np.arange(9).reshape(3,3)

In [7]: arr[range(3),range(3)]
Out[7]: array([0, 4, 8])

使用范围(或具有相同值的列表或数组),它返回一个1d数组,在这种情况下为2d数组的对角线。此索引选择一组点,而不是一个块。

numpy中,如果要使用“高级索引”获得二维结果,则需要创建一对索引数组,一起广播为正确的形状:

In [8]: arr[np.arange(3)[:,None],range(3)]
Out[8]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

在MATLAB / octave中,选择一个块很容易,但是选择单个元素要困难得多。

arr(sub2ind([3,3],[1,2,3],[1,2,3]))

通常,要了解numpy高级索引,您需要了解广播-它适用于索引以及诸如加法的数学运算。