Python 平均值忽略NumPy数组中沿列的NaN,而不使用NumPy.nanmean
我有一个numpy数组,如下所示:Python 平均值忽略NumPy数组中沿列的NaN,而不使用NumPy.nanmean,python,arrays,numpy,nan,Python,Arrays,Numpy,Nan,我有一个numpy数组,如下所示: x = array([[ 1., 2., 3.], [ 4., 5., 6.], [ nan, 8., 9.]]) 我想计算每列的平均值。如果我使用np.mean(x,axis=0),那么我得到nan作为第一列的平均值,并使用x[~np.isnan(x)]过滤nan值,将数组展平为1D数组 我需要使用旧版本的numpy,所以我不能使用 编辑:解释为什么这不是发布的问题的重复一种方法是使用
x = array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ nan, 8., 9.]])
我想计算每列的平均值。如果我使用np.mean(x,axis=0)
,那么我得到nan
作为第一列的平均值,并使用x[~np.isnan(x)]
过滤nan
值,将数组展平为1D数组
我需要使用旧版本的numpy,所以我不能使用
编辑:解释为什么这不是发布的问题的重复一种方法是使用
布尔索引
-
def nanmean_cols(x):
mask = ~np.isnan(x)
x_masked = np.where(mask, x, 0)
return x_masked.sum(0)/mask.sum(0)
样本运行-
In [114]: x
Out[114]:
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ nan, 8., 9.]])
In [115]: np.nanmean(x,axis=0)
Out[115]: array([ 2.5, 5. , 6. ])
In [117]: nanmean_cols(x)
Out[117]: array([ 2.5, 5. , 6. ])
我找到了另一种不使用布尔索引的方法:
means=[]
#迭代x中的每一列
对于x.T中的列:
过滤的值=列[~np.isnan(列)]
平均值=平均值(过滤值)
平均附加值(平均值)
单行版本:
means=[np.means(col[~np.isnan(col)]表示x.T中的col]
可能与@StefanoNardo相同,但发现得很好。链接问答的答案基本上是建议使用numpy.ma.masked_数组
,我还没有发现这是有效的,或者以某种形式使用nanmean
,OP不能使用。考虑到这种情况,IMHO使用常规布尔数组进行掩蔽将是一种可行的方法。