在python / numpy中 - 有没有办法构建一个包含factorial的表达式 - 但是在我的场景中,许多因子将被复制或减少,等到我指示运行时计算它。
我们说F(x) := x!
我构建了一个像(F(6) + F(7)) / F(4)
这样的表达式 - 我可以大大加快这一点,甚至可以通过这样做来做到这一点
(F(6) * (1 + 7)) / F(4)
= 5 * 6 * 8
= 240
基本上,我将生成这样的表达式,并希望计算机是智能的,而不是通过乘以1来计算所有因子,即使用我的例子实际上并不是
(6*5*4*3*2 + 7*6*5*4*3*2) / 4*3*2
我实际上已经开始开发一个Factorial类,但我是python和numpy的新手,并且想知道这是否已经解决了。
答案 0 :(得分:4)
正如@Oleg建议的那样,你可以用sympy做到这一点:
import numpy as np
import sympy as sp
# preparation
n = sp.symbols("n")
F = sp.factorial
# create the equation
f = (F(n) + F(n + 1)) / F(n - 2)
print(f) # => (factorial(n) + factorial(n + 1))/factorial(n - 2)
# reduce it
f = f.simplify()
print(f) # => n*(n - 1)*(n + 2)
# evaluate it in SymPy
# Note: very slow!
print(f.subs(n, 6)) # => 240
# turn it into a numpy function
# Note: much faster!
f = sp.lambdify(n, f, "numpy")
a = np.arange(2, 10)
print(f(a)) # => [ 8 30 72 140 240 378 560 792]
答案 1 :(得分:2)
如果空间效率不是一个主要问题,也许您可以考虑使用表格查找来提高效率。这将大大减少重复计算的次数。以下并不是非常有效,但它是基本的想法。
cache = {1:1}
def cached_factorial(n):
if (n in cache):
return cache[n]
else:
result = n * cached_factorial(n-1)
cache[n] = result
return result