Разница между переполнением / понижением при использовании numpy .log и math.log - PullRequest
2 голосов
/ 08 февраля 2020

Это не вопрос отладки. Однако я потратил много времени, пытаясь выяснить, почему numpy.log(factorial(n)) отказывается принимать любое значение, где n больше 20. Это выдает ошибку атрибута: 'int' object has no attribute 'log' и ошибку типа: loop of ufunc does not support argument 0 of type int which has no callable log method всякий раз, когда n было больше 20.

Я решил тогда использовать math.log(factorial(n)), и, к моему удивлению, все работало как ожидалось.

Мне было интересно, имел ли кто-нибудь опыт работы с numpy или знает больше о различных математических / numpy функциях, которые могут объяснить эту ошибку.

Вот пример того, где я использовал функцию журнала:

math.log(math.factorial(n))

* Правка для удаления моего оператора печати, который я использовал для проверки результатов

1 Ответ

0 голосов
/ 08 февраля 2020

Следующие математические фразы равны:

log(1 x 2 x 3 x ... x N) = log(1) + log(2) + log(3) + ... + log(N)

Это означает, что следующие функции равны:

# Logarithm of factorial
def f1(n):
    return math.log(math.factorial(n))

# Sum of logarithms
def f2(n): 
    return np.sum( np.log( np.arange(1, n+1) ) )

, что во второй, шанс достижения максимального значения целого числа в f1() выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...