如何忽略 numpy 数组中的 NaN 数据点并在 Python 中生成规范化数据?

新手上路,请多包涵

假设我有一个带有一些 float(‘nan’) 的 numpy 数组,我现在不想估算这些数据,我想首先对这些数据进行归一化并将 NaN 数据保留在原始空间,有什么办法可以做那?

以前我在 sklearn.Preprocessing --- 中使用了 normalize 函数,但该函数似乎不能将任何包含 NaN 的数组作为输入。

原文由 xxx222 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 977
2 个回答

您可以使用 numpy.ma.array 函数屏蔽您的阵列,然后应用任何 numpy 操作:

 import numpy as np

a = np.random.rand(10)            # Generate random data.
a = np.where(a > 0.8, np.nan, a)  # Set all data larger than 0.8 to NaN

a = np.ma.array(a, mask=np.isnan(a)) # Use a mask to mark the NaNs

a_norm  = a / np.sum(a) # The sum function ignores the masked values.
a_norm2 = a / np.std(a) # The std function ignores the masked values.

您仍然可以访问您的原始数据:

 print a.data

原文由 Chiel 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 numpy.nansum 计算范数并忽略 nan:

 In [54]: x
Out[54]: array([  1.,   2.,  nan,   3.])

这是忽略了 nan 的规范:

 In [55]: np.sqrt(np.nansum(np.square(x)))
Out[55]: 3.7416573867739413

y 是归一化数组:

 In [56]: y = x / np.sqrt(np.nansum(np.square(x)))

In [57]: y
Out[57]: array([ 0.26726124,  0.53452248,         nan,  0.80178373])

In [58]: np.linalg.norm(y[~np.isnan(y)])
Out[58]: 1.0

原文由 Warren Weckesser 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题