numpy 从索引列表创建 2D 掩码 [+ 然后从掩码数组绘制]
我有一个二维数组,里面存了一些值。我需要把这个数组中的某些元素遮住(这些元素的索引来自一个大约有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坐标——不过如果你知道一种高效的方法可以一步搞定这一切,那就更好了(也就是说,我可以先找出这些坐标,然后用它们去获取对应的主数组值;上面的示例只是个简化版)。
谢谢!
相关问题:
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)