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

Я использую numpy.log10 для расчета журнала массива значений вероятности. В массиве есть несколько нулей, и я пытаюсь обойти это, используя

result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)

Тем не мение, RuntimeWarning: divide by zero encountered in log10 еще появилось и я уверен, что именно эта строка вызвала предупреждение.

Хотя моя проблема решена, я запутался, почему это предупреждение появлялось снова и снова?

6 ответов

Решение

numpy.log10(prob) рассчитывает основание 10 логарифм для всех элементов probдаже те, которые не выбраны where, Если вы хотите, вы можете заполнить нули prob с 10**-10 или какое-то фиктивное значение, прежде чем принимать логарифм, чтобы избавиться от проблемы. (Убедитесь, что вы не вычисляете prob > 0.0000000001 с фиктивными значениями, хотя.)

Вы можете отключить его с помощью seterr

numpy.seterr(divide = 'ignore') 

и обратно с

numpy.seterr(divide = 'warn') 

Просто используйте where аргумент в np.log10

import numpy as np
np.random.seed(0)

prob = np.random.randint(5, size=4) /4
print(prob)

result = np.where(prob > 0.0000000001, prob, -10)
# print(result)
np.log10(result, out=result, where=result > 0)
print(result)

Выход

[1.   0.   0.75 0.75]
[  0.         -10.          -0.12493874  -0.12493874]

Я решил это, найдя самое низкое ненулевое число в массиве и заменив все нули числом, меньшим, чем самое низкое:p

В результате получается код, который будет выглядеть так:

def replaceZeroes(data):
  min_nonzero = np.min(data[np.nonzero(data)])
  data[data == 0] = min_nonzero
  return data

 ...

prob = replaceZeroes(prob)
result = numpy.where(prob > 0.0000000001, numpy.log10(prob), -10)

Обратите внимание, что ко всем числам добавляется крошечная дробь.

Просто укажитеwhereвычислятьlog10следующее:

       result = np.log10(prob,where=prob>0)

Вот демо:

Это решение сработало для меня, используйте numpy.sterr повернуть warnings выкл, за которым следует where

numpy.seterr(divide = 'ignore')
df_train['feature_log'] = np.where(df_train['feature']>0, np.log(df_train['feature']), 0)
Другие вопросы по тегам