我对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索引感到困惑。
提前感谢您的帮助。
答案 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
块。