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

How to calculate np.cov on a matrix with np.nan values without converting to pd.DataFrame?

我有以下 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 的 masked arrays

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