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

0 投票
1 回答
3371 浏览
提问于 2025-04-28 18:52

我有一个二维数组,里面存了一些值。我需要把这个数组中的某些元素遮住(这些元素的索引来自一个大约有10万个元组对的列表),然后从剩下的元素中随机抽样,抽样时不重复。

我希望这个过程既快又高效(最好能避免使用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坐标——不过如果你知道一种高效的方法可以一步搞定这一切,那就更好了(也就是说,我可以先找出这些坐标,然后用它们去获取对应的主数组值;上面的示例只是个简化版)。

谢谢!

相关问题:

根据某个列表中的值来遮罩Numpy数组

根据索引遮罩Numpy数组

二维数组的Numpy in1d实现?

暂无标签

1 个回答

3

你可以使用稀疏坐标矩阵来高效地完成这个任务。

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)

撰写回答