печать биномиального коэффициента с использованием NumPy - PullRequest
0 голосов
/ 11 октября 2019

Биномиальный коэффициент для заданного значения n и k (nCk), использующий numpy для умножения результатов цикла for, но метод numpy возвращает местоположение в памяти, а не результат, pls обеспечивают лучшее решение с точки зрения сложности времени, если это возможно. или любые другие предложения.

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)

1 Ответ

0 голосов
/ 11 октября 2019

Вы можете использовать scipy.special.binom().


РЕДАКТИРОВАТЬ

Я не совсем уверен, почему вы не хотите использовать 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():

%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 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...