您已经获得了许多如何做自己想要的事的好例子。但是,了解正在发生的事情以及事物按其工作方式运作的原因也很有用。有一些简单的规则可以在将来为您提供帮助。
“花式”索引(即使用列表/序列)和“普通”索引(使用切片)之间存在很大差异。根本原因与是否可以“规则地跨越”数组有关,因此与是否需要复制有关。因此,如果我们希望能够不复制而创建“视图”,则必须区别对待任意序列。
在您的情况下:
import numpy as npa = np.arange(100).reshape(10,10)n1, n2 = np.arange(5), np.arange(5)# Not what you wantb = a[n1, n2] # array([ 0, 11, 22, 33, 44])# What you want, but only for simple sequences# Note that no copy of *a* is made!! This is a view.b = a[:5, :5]# What you want, but probably confusing at first. (Also, makes a copy.)# np.meshgrid and np.ix_ are basically equivalent to this.b = a[n1[:,None], n2[None,:]]
一维序列的花式索引基本上等同于将它们压缩在一起并对其结果进行索引。
print "Fancy Indexing:"print a[n1, n2]print "Manual indexing:"for i, j in zip(n1, n2): print a[i, j]
但是,如果您要建立索引的序列与您要建立索引的数组的维数匹配(在这种情况下为2D),则对索引的处理会有所不同。numpy而不是“将两者压缩在一起”,而是像屏蔽一样使用索引。
换句话说,
a[[[1, 2, 3]], [[1],[2],[3]]]与完全不同
a[[1, 2, 3], [1, 2,3]],因为您要传递的序列/数组是二维的。
In [4]: a[[[1, 2, 3]], [[1],[2],[3]]]Out[4]:array([[11, 21, 31], [12, 22, 32], [13, 23, 33]])In [5]: a[[1, 2, 3], [1, 2, 3]]Out[5]: array([11, 22, 33])
更精确一点
a[[[1, 2, 3]], [[1],[2],[3]]]
完全一样地对待:
i = [[1, 1, 1], [2, 2, 2], [3, 3, 3]])j = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]a[i, j]
换句话说,输入是否为行/列向量是索引应如何在索引中重复的简写。
np.meshgrid而
np.ix_只是convienent的方式把你的1D序列到他们的2D版本索引:
In [6]: np.ix_([1, 2, 3], [1, 2, 3])Out[6]:(array([[1], [2], [3]]), array([[1, 2, 3]]))
同样(该
sparse参数将使其与
ix_上面相同):
In [7]: np.meshgrid([1, 2, 3], [1, 2, 3], indexing='ij')Out[7]:[array([[1, 1, 1], [2, 2, 2], [3, 3, 3]]), array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)