Python 平均值忽略NumPy数组中沿列的NaN,而不使用NumPy.nanmean

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,所以我不能使用 编辑:解释为什么这不是发布的问题的重复一种方法是使用

我有一个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使用常规布尔数组进行掩蔽将是一种可行的方法。