如何从numpy矩阵中删除nan和inf值?

10

这是我的代码

import numpy as np
cv = [[1,3,4,56,0,345],[2,3,2,56,87,255],[234,45,35,76,12,87]]
cv2 = [[1,6,4,56,0,345],[2,3,4,56,187,255],[234,45,35,0,12,87]]

output = np.true_divide(cv,cv2,where=(cv!=0) | (cv2!=0))
print(output)`

我得到了NaN和inf值。我试图分别删除它们,即先删除NaN再删除inf值,并用0替换它们。但我需要同时替换它们!有没有办法一起替换它们?

我遇到NaN和inf值的问题。我尝试将它们分别移除,先移除NaN再移除inf值,然后用0替换它们。但是我需要将它们一起替换!是否有一种方法可以同时替换它们?


但我需要一起替换它们!为什么? - roganjosh
3个回答

12

您可以使用以下掩码来替换NaN和无限值:

output[~np.isfinite(output)] = 0

>>> output
array([[1.        , 0.5       , 1.        , 1.        , 0.        ,
        1.        ],
       [1.        , 1.        , 0.5       , 1.        , 0.46524064,
        1.        ],
       [1.        , 1.        , 1.        , 0.        , 1.        ,
        1.        ]])

2
你不需要对以下两个函数进行 isnanisfinite 检查:"逐元素测试是否为有限数(既非无穷大也非非数字)" - user3483203

5

针对此问题,有一个特殊函数可以解决:

numpy.nan_to_num(x_arr, copy=False, nan=0.0, posinf=0.0, neginf=0.0)

3

如果您不想就地修改数组,可以利用np.ma库创建掩码数组:

np.ma.masked_array(output, ~np.isfinite(output)).filled(0)

array([[1.        , 0.5       , 1.        , 1.        , 0.        ,
        1.        ],
       [1.        , 1.        , 0.5       , 1.        , 0.46524064,
        1.        ],
       [1.        , 1.        , 1.        , 0.        , 1.        ,
        1.        ]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接