【发布时间】:2017-11-09 00:25:15
【问题描述】:
我有一个大的 ndarray X(大致为 (1e3, 1e3, 1e3)),我想在其中对 X 进行操作,包括但不包括第 0 轴的特定元素(对于第 1 和第第二轴)。即有 (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)
但这会使用额外的千兆字节内存来存储掩码数组。
有没有办法在不构造第二个 10^9 元素掩码数组的情况下做到这一点?例如,是否可以为掩码构造一个稀疏矩阵?
【问题讨论】:
-
不;
scipy.sparse没有实现任何类型的屏蔽。而np,ma不能使用sparse矩阵。请记住,np.ma在进行计算时,要么用无害的值(例如 0s、1s)填充掩码值,要么在没有掩码值的情况下将数组压缩为 1d。如果合适,您可以直接实施这些步骤。 -
@hpaulj 谢谢!这很有帮助。对于像
np.ma.std这样的函数,它如何处理掩码值?如果没有axis参数,那么大概数组被展平了……但是如果有axis参数怎么办——它既不能展平,也不能填充0,对吧? -
看来我们需要研究一下
numpy/ma/core.py。np.ma.std使用 mastd方法,它使用var,它使用mean,而后者又使用sum和count。ma.sum使用filled(0)。看起来count在~mask上使用sum- 即计算每个轴的未屏蔽值。 -
@hpaulj 哎呀......但是好吧,是的,这个想法是有道理的!
标签: python arrays numpy memory masked-array