use*_*287 3 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,)。我想要的是二维数组的前 5 行和列a。
当我执行 a[:5,:5],它似乎给了我一个形状数组 (5,5)。
有人可以向我解释为什么使用 range 函数指定索引会失败吗?即使在使用它将近一年之后,我仍然对 numpy 索引感到困惑。
提前感谢您的帮助。
随着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]])
Run Code Online (Sandbox Code Playgroud)
我可以更详细地介绍,但您也可以阅读该文档。
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]]))
Run Code Online (Sandbox Code Playgroud)
此 (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块。