Интерпретировать деление на ноль как нан - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь разделить один массив на другой, скажем,

a = np.array([[2., 2., 2., 2., 2.], [2., 2., 2., 2., 2.]])
b = np.array([[20., 16., 0., 10., nan], [5., 4., nan, 2., 0.]])

np.divide(a,b)

приведет к

array([[ 0.1  ,  0.125,    inf,  0.2  ,    nan],
       [ 0.4  ,  0.5  ,    nan,  1.   ,    inf]])

и выдаст мне ошибку RuntimeWarning: деление на ноль, встречающееся в true_divide,что не является большим сюрпризом.

Я пытался

try:
    np.divide(a,b)
except ZeroDivisionError:
    value = float('nan')

, который не работал.Также цикл if не был решением:

if b != 0:
    value = a / b
else:
    value = float('nan')

дает мне ошибку: «Значение истинности массива с более чем одним элементом неоднозначно.Используйте a.any () или a.all () '.Но вместо использования

if np.any(b != 0):

в качестве первой строки получается

array([[ 10. ,   8. ,   0. ,   5. ,   nan],
       [  2.5,   2. ,   nan,   1. ,   0. ]])

То же самое относится к

 if np.all(b != 0):

Я понимаю, что это должно быть связано с тем, чточто np.any просто возвращает логическое значение True или False.Нет ли другого способа заменить значения inf, которые приходят с

np.divide(a,b)

и принимать RuntimeWarning?

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете использовать numpy.isinf для замены значений inf и -inf на np.nan:

c = np.divide(a,b)
c[np.isinf(c)] = np.nan

print(c)

[[ 0.1    0.125    nan  0.2      nan]
 [ 0.4    0.5      nan  1.       nan]]
...