使用范围/arange函数作为参数索引/切片2D numpy阵列



我在numpy中有一个基本疑问。我正在使用python 2.7,ubuntu上的numpy-1.9.2 14.04。

例如,我将2D numpy数组初始化为a = np.zeros((10,10))

然后,我尝试使用范围函数作为索引作为索引来索引其中的一部分:

a[range(0,5),range(0,5)]。我得到了一个形状(5,)。我想要的是2D数组a的前5行和列。

当我执行a[:5,:5]时,它似乎给了我一个形状(5,5)。

有人可以向我解释为什么使用范围函数来指定索引失败?即使使用了将近一年后,我仍然对Numpy索引感到困惑。

感谢您提前的帮助。

使用range,您正在使用integer array indexing,如下所述:

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer-array-array-indexing

要获得相当于a[0:5,0:5]的等效,您必须利用"广播"。这里的第一个索引是列向量

a[np.arange(0,5)[:,None],range(0,5)]
In [137]: np.arange(0,5)[:,None]
Out[137]: 
array([[0],
       [1],
       [2],
       [3],
       [4]])

我可以详细介绍,但是您也可以阅读该文档


np.ix_是一个有助于生成这种索引数组的实用程序:

In [507]: np.ix_(range(0,5),range(0,5))
Out[507]: 
(array([[0],
        [1],
        [2],
        [3],
        [4]]), array([[0, 1, 2, 3, 4]]))

此(5,1)阵列广播(1,5)数组以产生(5,5)索引阵列。

matlab和numpy选择替代高级索引方法:

在MATLAB/OCTAVE中,a([1,2,3],[1,2,3])索引A(3,3)块。在numpy中,a[[1,2,3],[1,2,3]]索引(3)对角线。

a(sub2ind(size(a),[1,2,3],[1,2,3]))是八度的对角线;a[np.ix_([1,2,3],[1,2,3])]numpy块。

最新更新