我有一个庞大的ndarray(大约是(1e3, 1e3, 1e3)),我想对进行操作,包括但不限于对第0轴的特定元素进行操作(对于第1和第2轴的每个元素)。也就是说,有(1e3, 1e3)个元素,我希望在某些时候屏蔽它们或剔除它们。
最简单的做法是构造一个掩码数组,例如:
最简单的做法是构造一个掩码数组,例如:
Z = np.zeros_like(X, dtype=bool)
# assume `inds` is some indexing array which will target
# the particular (1e3 x 1e3) elements I'm interested in
Z[inds] = True
Y = np.ma.masked_array(X, mask=Z)
但是这样会额外使用1GB的内存来构建掩码数组。
有没有办法在不构建第二个 10^9
元素的掩码数组的情况下完成这个任务呢?例如,是否可以为掩码构建一个稀疏矩阵?
scipy.sparse
没有实现任何掩码功能。同时,np.ma
不能使用sparse
矩阵。请注意,np.ma
在计算时,会将掩码值填充为无害的值(例如0或1),或者压缩数组到1维并省略掩码值。如果适用的话,您可以直接执行这些步骤。 - hpauljnp.ma.std
这样的函数,它如何处理掩码值?如果没有axis
参数,那么数组被展平了...但是如果有axis
参数——它既不能展平,也不能填充 0,对吧? - DilithiumMatrixnumpy/ma/core.py
。np.ma.std
使用 ma 的std
方法,该方法使用var
,而var
又使用mean
,mean
又使用sum
和count
。ma.sum
使用了filled(0)
。看起来count
在~mask
上使用了sum
- 即按轴计算未屏蔽值的数量。 - hpaulj