使用range / arange函数作为参数索引/切片2d numpy数组

时间:2015-05-03 22:28:08

标签: python arrays numpy range

我对numpy有一个基本的怀疑。我在Ubuntu 14.04上使用Python 2.7,numpy-1.9.2。

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

然后我尝试使用范围函数作为索引来索引它的一部分,方法如下:

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

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

有人可以向我解释为什么使用range函数来指定索引会失败吗?即使在使用它近一年之后,我仍然对numpy索引感到困惑。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

使用range您正在使用此处所述的integer array indexing

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer-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])索引(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块。