numpy 从索引列表创建 2D 掩码 [+ 然后从掩码数组中绘制]

Posted

技术标签:

【中文标题】numpy 从索引列表创建 2D 掩码 [+ 然后从掩码数组中绘制]【英文标题】:numpy create 2D mask from list of indices [+ then draw from masked array] 【发布时间】:2014-10-21 12:28:45 【问题描述】:

我有一个二维值数组,需要屏蔽该数组的某些元素(索引取自约 100k 元组对的列表),然后从剩余元素中抽取随机样本而不进行替换。

我需要既快速/高效(希望避免 for 循环)又占用内存小的东西,因为实际上主阵列约为 20000 x 20000。

现在我会满足于(用于说明):

xys=[(1,2),(3,4),(6,9),(7,3)]

gxx,gyy=numpy.mgrid[0:100,0:100]
mask = numpy.where((gxx,gyy) not in set(xys)) # The bit I can't get right

# Now sample the masked array
draws=numpy.random.choice(master_array[mask].flatten(),size=40,replace=False)

幸运的是,现在我不需要绘制通量的 x,y 坐标 - 但如果您知道一种有效的方法来一步完成所有这些操作(即我可以先识别这些坐标是可以接受的)然后使用它们来获取对应的 master_array 值;上图是一个捷径)。

谢谢!

相关问题:

Numpy mask based on if a value is in some other list

Mask numpy array based on index

Implementation of numpy in1d for 2D arrays?

【问题讨论】:

【参考方案1】:

您可以使用稀疏 coo 矩阵有效地做到这一点

from scipy import sparse
xys=[(1,2),(3,4),(6,9),(7,3)]

coords = zip(*xys)
mask = sparse.coo_matrix((numpy.ones(len(coords[0])), coords ), shape= master_array.shape, dtype=bool)
draws=numpy.random.choice( master_array[~mask.toarray()].flatten(), size=10)

【讨论】:

感谢您提供快速而优雅的解决方案! 啊 - 我试图 避免 xys 中的任何对 - 因此第三种解决方案的逻辑反转了吗?第二个可以吗? 嗯,好的,但是你需要将它们全部反转。并且编辑不再有效

以上是关于numpy 从索引列表创建 2D 掩码 [+ 然后从掩码数组中绘制]的主要内容,如果未能解决你的问题,请参考以下文章

提取numpy数组中所有1序列的第一个和最后一个索引并将它们附加到列表中?

numpy 的花式索引是如何实现的?

科学计算基础软件包NumPy入门讲座:掩码数组

科学计算基础软件包NumPy入门讲座:掩码数组

使用索引同时从 numpy 2D 数组的行中减去多个值

SciPy 创建 2D 多边形蒙版