子集2D numpy数组

子集2D numpy数组,第1张

子集2D numpy数组

您已经获得了许多如何做自己想要的事的好例子。但是,了解正在发生的事情以及事物按其工作方式运作的原因也很有用。有一些简单的规则可以在将来为您提供帮助。

“花式”索引(即使用列表/序列)和“普通”索引(使用切片)之间存在很大差异。根本原因与是否可以“规则地跨越”数组有关,因此与是否需要复制有关。因此,如果我们希望能够不复制而创建“视图”,则必须区别对待任意序列。

在您的情况下:

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]])]


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5643540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存