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)
Обратите внимание, что ко всем числам добавляется крошечная дробь.
Это решение сработало для меня, используйте numpy.sterr
повернуть warnings
выкл, за которым следует where
numpy.seterr(divide = 'ignore')
df_train['feature_log'] = np.where(df_train['feature']>0, np.log(df_train['feature']), 0)