Векторизованное вычисление журнала (n!) - PullRequest
0 голосов
/ 11 мая 2019

У меня есть (произвольно сформированный) массив X целых чисел, и я хотел бы вычислить логарифм факториала каждой записи (Точно, а не через функцию Гамма). Числа достаточно велики, чтобы

np.log(scipy.special.factorial(X))

невозможно. Поэтому я хочу сделать что-то вроде np.sum(np.log(np.arange(2,X+1)), axis=-1)

Но функция arange () дает разный размер каждой записи, так что это не работает. Я думаю о дополнении, но я не уверен, как это сделать.

Можно ли это сделать векторизованным способом?

1 Ответ

5 голосов
/ 11 мая 2019

Я не вижу, какая у вас проблема с гамма-функцией. Гамма-функция не является аппроксимацией, и хотя аппроксимации могут участвовать в вычислении scipy.special.gammaln, нет оснований ожидать, что эти приближения будут хуже , чем ошибка, связанная с вычислением результата вручную. scipy.special.gammaln кажется идеальным инструментом для работы:

X_log_factorials = scipy.special.gammaln(X+1)

Если вы все равно хотите сделать это вручную, вы можете взять логарифмы всех натуральных чисел вплоть до максимума вашего массива, вычислить накопленную сумму и затем выбрать интересующие вас логарифмические множители:

logarithms = numpy.log(numpy.arange(1, X.max()+1))
log_factorials = numpy.cumsum(logarithms)
X_log_factorials = log_factorials[X-1]

(Если вы хотите обработать 0!, вам нужно будет сделать небольшую настройку, например, установив X_log_factorials[X==0] = 0.)

...