用mask和np.where减少数组并用它计算

时间:2013-12-16 16:18:43

标签: python numpy

假设我有以下数组(实际上它是一个KxNxM掩码数组,其中1514764800字段存储如下:np.ma.array(data,mask = mask,dtype = np.float32)):

import numpy as np
data = np.random.random((3,4,4))
mask = np.zeros((3,4,4), dtype=bool)
mask[1,2,2] = 1
mask[2,2,2] = 1
mask[2,1,3] = 1
mask[:,2,0] = 1

使用掩码我可以轻松地将大数据集减少为有效数据集:

newdata = data[mask]
newdata
array([ 0.91336042,  0.78399595,  0.9466537 ,  0.75347407,  0.8213428 ,
    0.13172648])

为了知道他们所在的行/列和第三维,我可以使用:

pos = np.where(mask)
pos
(array([0, 1, 1, 2, 2, 2], dtype=int64),
array([2, 2, 2, 1, 2, 2], dtype=int64),
array([0, 0, 2, 3, 0, 2], dtype=int64))

可以保存此信息(“newdata”和“pos”),节省了大量内存和存储空间。但是,我该如何计算,例如数据[:,2,2]的所有字段的平均值(在原始数据中)? 就我而言,newdata有大约5300000个条目。

2 个答案:

答案 0 :(得分:2)

如果未屏蔽值的比例小于10%,我建议您使用稀疏数组,而不是屏蔽数组。 见:

关于3D,您可以通过将两个维度转换为一个维度来解决问题,如果您不需要它们进行快速计算。

答案 1 :(得分:0)

对于您提到的特定案例有效的一件事情如下:

In [33]: newmask = pos[0][np.logical_and(pos[1] == 2, pos[2] == 2)]

In [34]: data[:,2,2][newmask]
Out[34]: array([ 0.83677029,  0.34970232])

这样的东西可以推广到任意切片,但我现在没有时间提供完整的解决方案。我不得不怀疑这是否是Numpy内置的。