我在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
块。