log的向量化计算(n!)

时间:2019-05-11 19:21:03

标签: python numpy multidimensional-array vectorization

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

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

是不可行的。所以我想做类似np.sum(np.log(np.arange(2,X+1)), axis=-1)

的事情

但是arange()函数为每个条目赋予不同的大小,因此这是行不通的。我虽然想用填充,但是我不确定如何做到这一点。

这可以通过矢量化方式完成吗?

1 个答案:

答案 0 :(得分:5)

我看不到gamma函数有什么问题。伽玛函数不是近似值,尽管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。)