【问题标题】:Translate Matlab's nchoosek to Python将 Matlab 的 nchoosek 翻译成 Python
【发布时间】:2021-06-24 23:08:42
【问题描述】:

我想将代码从 Matlab 翻译成 Python,但我找不到 nchoosek 的 Python 等效项。这是代码:

ber_c = nchoosek(n,e+1)*p.^(e+1)

我做了这个:

ber_c = comb(n, e + 1)*p**(e+1)

【问题讨论】:

  • 您有可用的scipy 库吗?如果是这样,scipy.misc.comb 可能就是您所需要的。
  • 您是使用nchoosek 来获取组合的数量,还是实际组合的数组? (我猜是前者,但最好确定一下。)
  • 我调用 scipy.misc 但我有 4 个选项:common、doccer、pilutil 和 setup
  • 所以scipy.misc.comb 应该很好地匹配nchoosek,但如果你想要精确的整数,你会想要使用comb(n, e+1, exact=True)。听起来好像您已经有了问题的答案。您遇到什么问题?例如,如果您遇到特定的 Python 异常,请显示回溯。如果您得到错误的结果,请显示您得到的结果和您预期的结果。
  • 这能回答你的问题吗? Python SciPy Possible cases of n choose k

标签: python combinations


【解决方案1】:

具体组合见itertools.combinations函数。

根据定义计算组合的数量很简单,您可以使用math.factorial 来帮助。

【讨论】:

  • 我认为 OP 想要组合数量的计数,而不是组合本身。
  • @MarkDickinson: nchoosek 似乎返回两者,具体取决于参数的类型。我编辑了答案。
【解决方案2】:

看看这个。

def nchoosek(n, k):
    if k == 0:
        r = 1
    else:
        r = n/k * nchoosek(n-1, k-1)
    return round(r)

【讨论】:

  • 这里为什么需要递归?
【解决方案3】:

这是一个更完整的答案。您应该使用 itertools.combinations 而不是 itertools.permutations,因为组合与排列非常不同。

例如,如果您需要数组的所有两个元素组合,例如 [1,2,3,5],以下代码将产生您想要的结果(相当于 Matlab 中的 nchoosek)

>>> import itertools
>>> all_combos = list(itertools.combinations([1,2,3,5], 2))
>>> print all_combos
[(1, 2), (1, 3), (1, 5), (2, 3), (2, 5), (3, 5)]

如果您希望将所有组合作为二维数组,只需使用以下命令将元组列表转换为 numpy 数组:

>>> all_combos = np.array(list(itertools.combinations([1,2,3,5], 2)))
>>> print all_combos
[[1 2]
[1 3]
[1 5]
[2 3]
[2 5]
[3 5]]

【讨论】:

    【解决方案4】:

    从 Python 3.8 开始,math module 包含 comb 方法:

    import math
    
    e=10
    n=30
    p=2
    print(math.comb(n,e+1)*p**(e+1))
    

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      相关资源
      最近更新 更多