如何在不转换为pd.DataFrame的情况下计算具有np.nan值的矩阵上的np.cov



我有以下np.array:

my_matrix = np.array([[1,np.nan,3], [np.nan,1,2], [np.nan,1,2]])
array([[ 1., nan,  3.],
[nan,  1.,  2.],
[nan,  1.,  2.]])

如果我在上面评估np.cov,我得到:

np.cov(my_matrix)
array([[nan, nan, nan],
[nan, nan, nan],
[nan, nan, nan]])

但如果我用pd.DataFrame.cov计算它,我会得到一个不同的结果:

pd.DataFrame(my_matrix).cov()
0   1   2
0   NaN NaN NaN
1   NaN 0.0 0.000000
2   NaN 0.0 0.333333

我知道根据pandas文档,它们处理nan值。

我的问题是,如何使用numpy获得相同(或相似的结果(?或者,在使用numpy计算协方差时,如何处理丢失的数据?

您可以使用Numpy的掩码数组。

import numpy.ma as ma
cv = ma.cov(ma.masked_invalid(my_matrix), rowvar=False)
cv
masked_array(
data=[[--, --, --],
[--, 0.0, 0.0],
[--, 0.0, 0.33333333333333337]],
mask=[[ True,  True,  True],
[ True, False, False],
[ True, False, False]],
fill_value=1e+20)

要生成填充了nan值的ndarray,请使用filled方法。

cv.filled(np.nan)
array([[       nan,        nan,        nan],
[       nan, 0.        , 0.        ],
[       nan, 0.        , 0.33333333]])

注意,默认情况下np.cov会产生成对的行协变量。要复制Pandas行为(成对列协变(,必须将rowvar=False传递给ma.cov

最新更新