【发布时间】:2016-10-09 06:31:15
【问题描述】:
假设我们有 n 投掷 k 球的垃圾箱。什么是快速(即使用 numpy/scipy 而不是 python 代码)将所有可能的结果生成为矩阵的方法?
例如,如果n = 4 和k = 3,我们需要以下numpy.array:
3 0 0 0
2 1 0 0
2 0 1 0
2 0 0 1
1 2 0 0
1 1 1 0
1 1 0 1
1 0 2 0
1 0 1 1
1 0 0 2
0 3 0 0
0 2 1 0
0 2 0 1
0 1 2 0
0 1 1 1
0 1 0 2
0 0 3 0
0 0 2 1
0 0 1 2
0 0 0 3
如果遗漏了任何排列,我们深表歉意,但这是总体思路。生成的排列不必按任何特定顺序排列,但上面的列表便于在心理上对它们进行分类迭代。
更好的是,有没有办法将每个整数从 1 映射到 multiset number(此列表的基数)直接映射到给定的排列?
这个问题与以下问题有关,这些问题在 R 中实现,具有非常不同的设施:
- Generating all permutations of N balls in M bins
- Generate a matrix of all possible outcomes for throwing n dice (ignoring order)
还有相关参考资料:
【问题讨论】:
-
需要按这个顺序吗?
-
@Kupiakos 不。我没有意识到,发布第一个问题的人列出了相同的列表。
-
从stars and bars 的角度思考,使用“未排名组合”的算法来查找条形(或星形)的位置。此处概述了一种这样的算法:Finding the k-combination for a given number。
-
谢谢@morningsun。我会自己实现它,但最好先知道 Python 世界中是否已经存在类似的东西。
标签: python numpy scipy permutation combinatorics