使用numpy计算多个数组的平均值,不考虑零值。

4

我正在处理numpy的相关工作,有一些大小和形状相同的数组,如下所示: a= [153 186 0 258] b=[156 136 156 0] c=[193 150 950 757] 我想要这些数组的平均值,但是我希望程序在计算时忽略零值。因此,针对此示例的结果数组将是:d=[167.333 157.333 553 507.5] 这是该计算的结果:d=[(153+156+193)/3 (186+136+150)/3 (156+950)/2 (258+757)/2]。是否可以实现这个功能?

1个回答

14

在Python中:

>>> a = [153, 186, 0, 258]
>>> b = [156, 136, 156, 0]
>>> c = [193, 150, 950, 757]
>>> import statistics
>>> [statistics.mean([x for x in s if x]) for s in zip(*[a, b, c])]
[167.33333333333334, 157.33333333333334, 553, 507.5]

在NumPy中:

>>> import numpy as np
>>> A = np.vstack([a,b,c])
>>> np.average(A, axis=0, weights=A.astype(bool))
array([ 167.33333333,  157.33333333,  553.        ,  507.5       ])

如果一列中的所有值都可能等于零,您可能希望使用掩码数组以避免规范化不可能的问题(权重不能加起来等于零)。 输出中未定义的部分将被掩码。

>>> a[0] = b[0] = c[0] = 0
>>> A = np.vstack([a,b,c])
>>> np.ma.average(A, axis=0, weights=A.astype(bool))
masked_array(data=[--, 157.33333333333334, 553.0, 507.5],
             mask=[ True, False, False, False],
             fill_value=1e+20)
>>> np.ma.average(A, axis=0, weights=A.astype(bool)).tolist()
[None, 157.33333333333334, 553.0, 507.5]

我的数组是1200*1200的,我在问题中试图简化它。似乎对于有多行的数组不起作用。我该怎么做? - f.ashouri
假设您希望输出的形状也为(1200,1200),请改用np.dstack并沿深度轴进行平均。如果您希望输出形状为(1200,),那么我看不出为什么vstack不起作用。 - wim
1
非常好的回答!我使用 np.ma.average() 作为一种稳健的解决方案来处理所有值的总和为零的情况。 - Jason Bellino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接