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
。)
我有一个(任意形状的)整数数组 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
。)