【问题标题】:printing binomial coefficient using numpy使用 numpy 打印二项式系数
【发布时间】:2019-10-11 11:44:59
【问题描述】:

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)

【问题讨论】:

  • 为什么要使用numpy
  • 建议任何其他方法@norok2
  • 不要写成numpy.prod((n+1-i)/i for i in range(1,k+1)),写成i = np.arange(1, k+1); np.prod(n + 1 - i / i)

标签: python numpy dynamic-programming


【解决方案1】:

您可能想使用: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

【讨论】:

猜你喜欢
  • 2016-07-04
  • 2021-05-03
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多