我有一个二级数组,并希望使用切片来索引它。如果我在适当的位置创建切片,我会得到预期的结果:
A =兰特(3,3)断言(allclose(A [0:3,0:3],A))另一方面,如果我……
你为什么期望他们做同样的事情? numpy 与这种索引不同于MATLAB。
numpy
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 如果你想要一个带有'高级索引'的2d结果,你需要创建一对索引数组,它们一起广播到正确的形状:
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 您需要了解广播的高级索引 - 适用于索引以及添加等数学运算。