print(a)
[[ 0.93230948 nan 0.47773439 0.76998063]
[ 0.94460779 0.87882456 0.79615838 0.56282885]
[ 0.94272934 0.48615268 0.06196785 nan]
[ 0.64940216 0.74414127 nan nan]]
#Obtain mean of columns as you need, nanmean is just convenient.
col_mean = np.nanmean(a, axis=0)
print(col_mean)
[ 0.86726219 0.7030395 0.44528687 0.66640474]
#Find indicies that you need to replace
inds = np.where(np.isnan(a))
#Place column means in the indices. Align the arrays using take
a[inds] = np.take(col_mean, inds[1])
print(a)
[[ 0.93230948 0.7030395 0.47773439 0.76998063]
[ 0.94460779 0.87882456 0.79615838 0.56282885]
[ 0.94272934 0.48615268 0.06196785 0.66640474]
[ 0.64940216 0.74414127 0.44528687 0.66640474]]
如果partial是原始数据,而replace是包含平均值的同一形状数组,则此代码将使用partial中的值(如果存在)。
不需要循环:
使用屏蔽数组
只使用numpy的标准方法是使用masked array模块。
Scipy是一个非常重的包,它依赖于外部库,因此有一个只使用numpy的方法是值得的。这借用了@DonaldHobson的答案。
编辑:^{} 现在是一个numpy函数。但是,它不能处理所有的nan列。。。
假设您有一个数组
a
:注意,屏蔽数组的平均值不需要与
a
的形状相同,因为我们利用了行上的隐式broadcasting。还要注意如何很好地处理all-nan列。因为取零元素的平均值,所以平均值为零。使用
nanmean
的方法不能处理所有nan列:说明
将
a
转换为屏蔽数组取列上的平均值将给出正确的答案,仅对非屏蔽值进行规范化:
此外,请注意掩码如何很好地处理all nan列!
最后,^{} 完成替换工作。
行平均值
要将
nan
值替换为行平均值而不是列平均值,广播需要进行微小的更改才能很好地生效:相关问题 更多 >
编程相关推荐