Python 对数(n!)的矢量化计算

Python 对数(n!)的矢量化计算,python,numpy,multidimensional-array,vectorization,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()函数为每个条目提供不同的大小,因此这不起作用。我考虑过用填充物填充,但我不知道怎么做 这可以用矢量化的方式实现吗?我不知道gamma函数有什么问题。gamma函数不是近似值,虽

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

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

但是arange()函数为每个条目提供不同的大小,因此这不起作用。我考虑过用填充物填充,但我不知道怎么做


这可以用矢量化的方式实现吗?

我不知道gamma函数有什么问题。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\u log\u factorials[X==0]=0

X的最小值和最大值是多少?@Divakar顺序为~2500+-200谢谢。再次感谢你纠正我关于伽马函数的错误。出于兴趣,我尝试使用斯特林、内姆斯和拉马努扬()的近似法。但是,尽管后两个参数在OP感兴趣的参数(2500+/-200)上相当准确,但这三个参数实际上都比
gammaln
;-)慢