numpy蒙面数组的高效内存使用

时间:2017-06-07 14:58:31

标签: python arrays numpy memory masked-array

我有一个大的ndarray X(大约(1e3,1e3,1e3)),我想要操作X包括但不包括第0轴的特定元素(对于第1和第2轴的每个元素)。即,有(1e3,1e3)个元素,我想(有时)屏蔽或输出。 最简单的方法是构造一个蒙面数组,如: Z = np.zeros_like(X,dtype = bool) #assume`inds`是一个将要定位的索引数组 #我感兴趣的特定(1e3 x 1e3)元素 Z [inds] =真 Y = np.ma.masked_array(X,mask = Z) 但是这仅为掩蔽阵列使用额外的千兆字节内存。 有没有办法在不构建第二个10 ^ 9元素掩码阵列的情况下做到这一点?例如,是否可以为掩码构造稀疏矩阵?

1 个答案:

答案 0 :(得分:1)

如果你只想采取"清洁"切片,而不是从某些"行"中取出一些元素,然后你可以使用数字索引而不是掩码。

E.g:

arr = np.array([[[1,2,3,4], [5,6,7,8]], [[9,8,9,8], [7,6,7,6]]])
sub_idx = np.array([0,2])
sub_arr = arr[:, :, sub_idx]

这是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