Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy掩蔽阵列的高效内存使用_Python_Arrays_Numpy_Memory_Masked Array - Fatal编程技术网

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
使用ma
std
方法,该方法使用
var
,该方法使用
均值
,而均值又使用
总和
计数
<代码>总金额使用
填充(0)
。看起来
count
~mask
上使用
sum
-即对每个轴的未屏蔽值进行计数。@hpaulj-yikes。。。但好吧,是的,这个想法很有道理!
sub_arr[:] = 0 # Manipulate the values
arr[sub_idx] = sub_arr