log(n!) 的向量化计算

Vectorized computation of log(n!)

我有一个(任意形状的)整数数组 X,我想计算每个条目的阶乘的对数(准确地说,不是通过 Gamma 函数)。 数字足够大

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

不可行。所以我想做一些像 np.sum(np.log(np.arange(2,X+1)), axis=-1)

但是 arange() 函数为每个条目提供了不同的大小,所以这是行不通的。我想用 ones 填充,但我不确定该怎么做。

这可以用向量化的方式完成吗?

我看不出你的 gamma 函数有什么问题。 gamma 函数不是近似值,虽然 scipy.special.gammaln 的计算可能涉及近似值,但没有理由期望这些近似值 中涉及的误差更差手动计算结果。 scipy.special.gammaln 似乎是完成这项工作的完美工具:

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

如果您想手动执行此操作,您可以取所有正整数的对数直到数组的最大值,计算累加和,然后 select log-factorials 您'感兴趣:

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。)