使用索引和掩码数组计算多维数组的平均值

时间:2019-03-28 00:22:03

标签: python numpy multidimensional-array

m =  np.array([[[0.4,0.5],[0.2,0.3]], [[0.8,0.1],[0.7,0.9]]])
id = np.array([[[1,2],[2,3]], [[3,1],[3,2]]])
mask = np.array([[[0,1],[1,0]], [[1,1],[1,1]]])

我想计算m中每个索引的id的平均值,并且只计算mask中非零元素的平均值。

例如对于id==3,这就是[0.8,0.7]的平均值。

我认为np.ma.masked_array.mean可以解决问题,但这并不能给我带来预期的输出结果

 >> np.ma.masked_array(m[id==3],mask=mask[id==3]).mean()
    0.29999999

2 个答案:

答案 0 :(得分:3)

简单的数组索引应该可以工作:

import numpy as np

m =  np.array([[[0.4,0.5],[0.2,0.3]], [[0.8,0.1],[0.7,0.9]]])
my_id = np.array([[[1,2],[2,3]], [[3,1],[3,2]]])
mask = np.array([[[0,1],[1,0]], [[1,1],[1,1]]])

print(m[(mask != 0) & (my_id == 3)])          # [0.8 0.7]
print(m[(mask != 0) & (my_id == 3)].mean())   # 0.75

此外,id是一个内置函数,因此请勿命名该变量。它将隐藏内置的内容。

答案 1 :(得分:2)

mid_都应用掩码,然后使用np.bincount

m =  np.array([[[0.4,0.5],[0.2,0.3]], [[0.8,0.1],[0.7,0.9]]])
id_ = np.array([[[1,2],[2,3]], [[3,1],[3,2]]])
mask = np.array([[[0,1],[1,0]], [[1,1],[1,1]]])

mask = mask.astype(bool)
mm, idm = m[mask], id_[mask]
result = np.bincount(idm, mm)/np.bincount(idm)

result
# array([       nan, 0.1       , 0.53333333, 0.75      ])

result包含所有均值,例如result[3]id_ 3的均值。

注意:您的方法无效,因为按照惯例,在掩码数组中,掩码指定 missing 不是有效数据,换句话说,您必须反转掩码。