Я не вижу, какая у вас проблема с гамма-функцией. Гамма-функция не является аппроксимацией, и хотя аппроксимации могут участвовать в вычислении 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
.)