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
答案 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)
对m
和id_
都应用掩码,然后使用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 不是有效数据,换句话说,您必须反转掩码。