Как применить натуральный логарифм к матрице и получить ноль для случая, когда элемент матрицы равен нулю - PullRequest
0 голосов
/ 25 сентября 2019

В Python у меня есть матрица с некоторыми нулевыми значениями, как я могу применить натуральный логарифм и получить ноль для случая, когда запись в матрице равна нулю?Я использую numpy.log (matrix) для применения функции натурального логарифма, но я получаю nan, когда запись в матрице равна нулю, и я хотел бы, чтобы она была равна нулю

Ответы [ 4 ]

1 голос
/ 25 сентября 2019

Вы можете сделать что-то вроде этого:

arr = numpy.nan_to_num(numpy.log(matrix))

Поведение nan_to_num заменяет все NaN на нули.

Вы можете найти больше информации здесь:

Другой альтернативой является передача маски аргументу where= функции np.log.

0 голосов
/ 26 сентября 2019

np.log - это ufunc, который принимает параметр where.Это говорит о том, какие элементы x будут использоваться в расчете.Остальные пропущены.Это лучше всего использовать с параметром out, следующим образом:

In [25]: x = np.array([1.,2,0,3,10,0])                                          
In [26]: res = np.zeros_like(x)                                                 
In [27]: idx = x>0                                                              
In [28]: np.log(x)                                                              
/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in log
  #!/usr/bin/python3
Out[28]: 
array([0.        , 0.69314718,       -inf, 1.09861229, 2.30258509,
             -inf])
In [29]: np.log(x, out=res, where=idx)                                          
Out[29]: 
array([0.        , 0.69314718, 0.        , 1.09861229, 2.30258509,
       0.        ])
0 голосов
/ 25 сентября 2019

Вы можете использовать numpy.log1p, он оценивается в ноль, если запись равна нулю (поскольку лог 1 равен нулю), а обратная операция - numpy.expm1.

Более подробную информацию можно найти вдокументация:

  1. Log1p
  2. Expm1
0 голосов
/ 25 сентября 2019

Вы можете использовать np.where.Seterr должен отключить предупреждение.

RuntimeWarning: деление на ноль, встречающееся в журнале

In:

np.seterr(divide = 'ignore')

matrix = np.array([[10,0,5], [0,10,12]])
np.where(matrix == 0, 0, np.log(matrix))

Out:

array([[2.30258509, 0.        , 1.60943791],
       [0.        , 2.30258509, 2.48490665]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...