如何在具有 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
。
我有以下 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
。