【问题标题】:Vectorized computation of log(n!)log(n!) 的向量化计算
【发布时间】:2019-09-29 07:18:18
【问题描述】:

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

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

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

但是 arange() 函数为每个条目提供不同的大小,所以这不起作用。我想用一个填充,但我不知道该怎么做。

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

【问题讨论】:

  • X 的最小值和最大值是多少?
  • @Divakar Order of ~2500 +- 200

标签: python numpy multidimensional-array vectorization


【解决方案1】:

我看不出您对 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_log_factorials[X==0] = 0。)

【讨论】:

  • 谢谢。然后再次纠正我关于 Gamma 函数的问题
  • 不错。出于兴趣,我尝试使用 Stirling、Nemes 和 Ramanujan (en.wikipedia.org/wiki/Stirling%27s_approximation) 的近似值。但是,虽然后两者在 OP 感兴趣的论点上非常准确(2500 +/- 200),但实际上这三个都比gammaln 慢;-)
猜你喜欢
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2010-12-09
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多