除以0后,在numpy数组中将NaN替换为0

Yas*_*eth 5 python arrays numpy divide-by-zero

我正在划分两个numpy数组:

>>> import numpy as np
>>> a1 = np.array([[ 0,  3],
                   [ 0,  2]])
>>> a2 = np.array([[ 0,  3],
                   [ 0,  1]])
>>> d = a1/a2
>>> d
array([[ nan,   1.],
       [ nan,   2.]])
>>> where_are_NaNs = np.isnan(d)
>>> d[where_are_NaNs] = 0
>>> d
>>> array([[ 0.,  1.],
           [ 0.,  2.]])
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来获得0而不是使用for循环的Nan?

numpy fillna()和pandas 有类似的功能吗?

Geo*_*tob 9

这应该工作并将所有NAN转换为0

d[np.isnan(d)] = 0
Run Code Online (Sandbox Code Playgroud)

如果你想要一行,请考虑

d = np.nan_to_num(a1/a2)
Run Code Online (Sandbox Code Playgroud)

将所有NAN转换为0,请参见此处:http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.nan_to_num.html

注意:除以0时,您应该遵循下面的@ imp9解决方案,以避免不必要的警告或错误.


ily*_*nam 5

您可能应该在的上下文中np.errstate(divide='ignore', invalid='ignore')进行除法,以使被除数本身不为零(两者是单独的警告)时,除以0不会引发错误或警告。

with np.errstate(divide='ignore', invalid='ignore'):
    d = a1/a2
#Geotob's solution
d[np.isnan(d)] = 0
Run Code Online (Sandbox Code Playgroud)

如果您希望它发出警告,请更改'ignore''warn'参考

  • 请注意,划分和无效的“RuntimeWarning”是独立且不同的东西。`0 / 0` 返回 `NaN` 并引发无效值警告,而 `a/0`(其中 `a` 为非零)返回 `inf`(如果 `a` 为负数则返回 `-inf`)并引发划分警告。因此,您可能只想根据用例忽略一个警告。 (3认同)