使用numpy打印二项式系数

加维特·亚吉

给定的 n 和 k(nCk) 值的二项式系数使用 numpy 乘以 for 循环的结果,但 numpy 方法返回内存位置而不是结果,如果可能的话,请在时间复杂度方面提供更好的解决方案。或任何其他建议。

import time
import numpy
def binomialc(n,k):
    return 1 if k==0 or k==n else numpy.prod((n+1-i)/i for i in range(1,k+1))
starttime=time.perf_counter()
print(binomialc(600,298))
print(time.perf_counter()-starttime)
诺克2

您可能想要使用: scipy.special.binom()

或者,从 Python 3.8 开始: math.comb()


编辑

我不太确定为什么你不想使用SciPy但你对NumPy 没问题,因为 SciPy 是一个完善的库,来自开发 NumPy 的基本上相同的人。

无论如何,这里有一些其他方法:

  • 使用math.factorial
import math


def binom(n, k):
    return math.factorial(n) // math.factorial(k) // math.factorial(n - k)
  • 使用prod()math.factorial()(理论上更有效,但实际上并非如此):
def prod(items, start=1):
    for item in items:
        start *= item
    return start


def binom_simplified(n, k):
    if k > n - k:
        return prod(range(k + 1, n + 1)) // math.factorial(n - k)
    else:
        return prod(range(n - k + 1, n + 1)) // math.factorial(k)
  • 使用numpy.prod()
import numpy as np


def binom_np(n, k):
    return 1 if k == 0 or k == n else np.prod([(n + 1 - i) / i for i in range(1, k + 1)])

速度方面,scipy.special.binom()是迄今为止最快的,但如果您也需要非常大的数字的确切值,您可能更喜欢binom()(甚至有点令人惊讶math.comb())。

%timeit scipy.special.binom(600, 298)
# 1000000 loops, best of 3: 1.56 µs per loop
print(scipy.special.binom(600, 298))
# 1.3332140543730587e+179

%timeit math.comb(600, 298)
# 10000 loops, best of 3: 75.6 µs per loop
print(math.binom(600, 298))
# 133321405437268991724586879878020905773601074858558174180536459530557427686938822154484588609548964189291743543415057988154692680263088796451884071926401665548516571367537285901600

%timeit binom(600, 298)
# 10000 loops, best of 3: 36.5 µs per loop
print(binom(600, 298))
# 133321405437268991724586879878020905773601074858558174180536459530557427686938822154484588609548964189291743543415057988154692680263088796451884071926401665548516571367537285901600

%timeit binom_np(600, 298)
# 10000 loops, best of 3: 45.8 µs per loop
print(binom_np(600, 298))
# 1.3332140543726893e+179

%timeit binom_simplified(600, 298)
# 10000 loops, best of 3: 41.9 µs per loop
print(binom_simplified(600, 298))
# 133321405437268991724586879878020905773601074858558174180536459530557427686938822154484588609548964189291743543415057988154692680263088796451884071926401665548516571367537285901600

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章