微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

替换方阵中的 nan 值

如何解决替换方阵中的 nan 值

我是第一次使用 numpy

我有一个方阵(158 x 158)。我想用对角线的中值替换矩阵对角线上的任何 NaN 值。我想为零的任何非对角线值。

我写的代码不起作用,

cov_martix = np.cov(np.transpose(coeff),rowvar=False)

# any nan's on the diagional are replaced by the median value of the diag
# any nan's off the diag are replaced with zero
diag = np.nanmedian(np.diag(cov_martix))
cov_martix = np.fill_diagonal(cov_martix,diag)
cov_martix = np.nan_to_num(cov_martix)

问题在于 np.fill_diagonal 行,运行该行后 cov_martix 变为 None。我不确定我做错了什么。

解决方法

更改这一行:

cov_martix = np.fill_diagonal(cov_martix,diag)

np.fill_diagonal(cov_martix,diag)

编辑:同时删除最后一行中的 cov_matrix=

,

numpy.fill_diagonal 根据 docs

此函数就地修改输入数组,它不返回值。

因此产生None。您不应该将它重新分配回数组。 此外,您不是用对角线的 nan 替换对角线中的 median 值,而是用对角线的 median 替换所有对角线元素。

你能不能试试这个:

>>> diag = np.diag(cov_matrix)
>>> np.fill_diagonal(cov_matrix,np.nan_to_num(diag,nan=np.nanmedian(diag)))
>>> cov_matrix = cov_matrix * np.eye(cov_matrix.shape[0])

例如:

>>> cov_matrix

array([[ 2.,0.,4.,4.],[ 1.,2.,1.],nan,3.],[ 2.,1.,1.]])

>>> diag = np.diag(cov_matrix)
>>> np.nan_to_num(diag,nan=np.nanmedian(diag))
array([2.,1.])

>>> np.fill_diagonal(cov_matrix,nan=np.nanmedian(diag)))

>>> cov_matrix
array([[2.,[1.,[2.,1.]])

>>> cov_matrix = cov_matrix * np.eye(cov_matrix.shape[0])
>>> cov_matrix

array([[2.,0.],[0.,1.]])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。