表示在不使用 numpy.nanmean 的情况下忽略 NumPy 数组中各列的 NaN
Mean ignoring NaNs along columns in a NumPy array without using numpy.nanmean
我有一个像下面这样的 numpy 数组:
x = array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ nan, 8., 9.]])
我想计算每列的平均值。如果我使用 np.mean(x, axis=0)
,那么我得到 nan
作为第一列的平均值,并使用 x[~np.isnan(x)]
过滤掉 nan
值将数组展平为一维数组。
我需要使用旧版本的 numpy,所以我不能使用 numpy.nanmean
编辑: 解释了为什么这不是已发布问题的重复
一种方法是使用 boolean-indexing
-
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 = []
# Iterate over each column in x
for col in x.T:
filtered_vals = col[~np.isnan(col)]
avg = np.mean(filtered_vals)
means.append(avg)
一行版本:
means = [np.mean(col[~np.isnan(col)]) for col in x.T]
我有一个像下面这样的 numpy 数组:
x = array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ nan, 8., 9.]])
我想计算每列的平均值。如果我使用 np.mean(x, axis=0)
,那么我得到 nan
作为第一列的平均值,并使用 x[~np.isnan(x)]
过滤掉 nan
值将数组展平为一维数组。
我需要使用旧版本的 numpy,所以我不能使用 numpy.nanmean
编辑:
一种方法是使用 boolean-indexing
-
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 = []
# Iterate over each column in x
for col in x.T:
filtered_vals = col[~np.isnan(col)]
avg = np.mean(filtered_vals)
means.append(avg)
一行版本:
means = [np.mean(col[~np.isnan(col)]) for col in x.T]