假设我有以下数组(实际上它是一个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个条目。
答案 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内置的。