Python numpy掩蔽阵列的高效内存使用
我有一个很大的数组Python numpy掩蔽阵列的高效内存使用,python,arrays,numpy,memory,masked-array,Python,Arrays,Numpy,Memory,Masked Array,我有一个很大的数组X(大致为(1e3,1e3,1e3)),其中我想对X进行操作,包括和不包括第0轴的特定元素(第一轴和第二轴的每个元素)。i、 e.有(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'
X
(大致为(1e3,1e3,1e3)),其中我想对X
进行操作,包括和不包括第0轴的特定元素(第一轴和第二轴的每个元素)。i、 e.有(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)
但这只为屏蔽阵列使用了额外的GB内存。
有没有办法在不构建第二个10^9
元素掩码数组的情况下实现这一点?例如,是否可以为掩码构造稀疏矩阵?如果您只想获取“干净”切片,而不是仅从某些“行”中获取某些元素,则可以使用数字索引而不是掩码
例如:
这是arr
子集的副本,即最后一个维度中的第0个和第2个“切片”:
array([[[1, 3],
[5, 7]],
[[9, 9],
[7, 7]]])
请注意,定义要使用哪些索引的数组只是一维的,这严重降低了它的内存需求。(当然,在您的案例中,副本仍然会占用大量内存。)
还请注意,这会提供一个副本,因此对结果所做的任何更改(sub_arr
)都不会显示在原始数组中。为此,您必须将阵列复制回:
sub_arr[:] = 0 # Manipulate the values
arr[sub_idx] = sub_arr
嗯,是的,我想我可以只存储那些子数组值,然后根据需要将它们归零并替换它们。。。这并不适用于所有情况(例如,有时你真的想忽略元素而不是将其设置为零;例如,计算标准偏差或其他情况)--但这可能适用于我的情况,感谢你的建议我不是说你必须将其设置为零-这只是我操纵子数组的示例。当然,但是,我仍然认为有些问题没有一个填充值可以解决
scipy.sparse
不实现任何类型的掩蔽。和np,ma
不能使用sparse
矩阵。请记住,np.ma
在进行计算时,要么用无害值(例如0s、1s)填充屏蔽值,要么将数组压缩到1d,而不使用屏蔽值。如果合适,您可以直接执行这些步骤。@hpaulj谢谢!这很有帮助。对于像np.ma.std这样的函数,它如何处理屏蔽值?如果没有axis
参数,则假定数组是平坦的。。。但是如果有一个轴
参数——它既不能展平也不能填充0,对吗?看起来我们需要研究numpy/ma/core.py
np.ma.std
使用mastd
方法,该方法使用var
,该方法使用均值
,而均值又使用总和
和计数
<代码>总金额使用填充(0)
。看起来count
在~mask
上使用sum
-即对每个轴的未屏蔽值进行计数。@hpaulj-yikes。。。但好吧,是的,这个想法很有道理!
sub_arr[:] = 0 # Manipulate the values
arr[sub_idx] = sub_arr