Python 生成a 0和b 1的所有可能组合

Python 生成a 0和b 1的所有可能组合,python,numpy,combinations,itertools,Python,Numpy,Combinations,Itertools,有没有一种有效的方法来生成一个列表(或数组),其中包含2个1和8个0的所有可能组合?例如 [[0,0,0,0,0,0,0,0,1,1], [0,0,0,0,0,0,0,1,0,1,], ...] 这是可行的,但还有更好的办法吗 import numpy as np result = [] for subset in itertools.combinations(range(10), 2): subset = list(subset) c = np.zeros(10)

有没有一种有效的方法来生成一个列表(或数组),其中包含2个1和8个0的所有可能组合?例如

[[0,0,0,0,0,0,0,0,1,1],
 [0,0,0,0,0,0,0,1,0,1,],
 ...]
这是可行的,但还有更好的办法吗

import numpy as np
result = []
for subset in itertools.combinations(range(10), 2):
    subset = list(subset)
    c = np.zeros(10)
    c[subset] = 1
    result.append(c)

我很想对如何优化这段代码有一些想法。

嗯,这没什么不同,但在Numpy阵列上执行批量操作的开销肯定会小得多:

import itertools
import numpy

which = numpy.array(list(itertools.combinations(range(10), 2)))
grid = numpy.zeros((len(which), 10), dtype="int8")

# Magic
grid[numpy.arange(len(which))[None].T, which] = 1

grid
#>>> array([[1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
#>>>        [1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
#>>>        [1, 0, 0, 1, 0, 0, 0, 0, 0, 0],
#>>>        [1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
#>>>        [1, 0, 0, 0, 0, 1, 0, 0, 0, 0],
#>>> ...
然后大部分时间都花在了
numpy.array(列表(itertools.compositions(范围(10),2))
。我试着使用
numpy.fromiter
,但没有任何速度提升。由于有一半的时间是直接生成元组,因此进一步改进的唯一真正方法是以C或Cython之类的形式生成组合。

使用以下替代方法:


我们不应该使用排列吗?例如

from itertools import permutations as perm
a, b = 6, 2
print '\n'.join(sorted([''.join(s) for s in set(t for t in perm(a*'0' + b*'1'))]))

谢谢这似乎很有效。对于51和55 0的组合,它给了我以下基准:时间(原始解决方案):13.2389998436时间(np.arange):1.6970000267很好地使用了奇特的索引!FWIW
np.fromiter(组合(范围(55),5),np.dtype(“i4,i4,i4”),3478761.view(“i4”).reformate(-1,5)
比先构建列表快约1.7倍,尽管这种优势对于较小的大小并不适用。@Jaime感谢时间安排,但我无法在Python 2.7或3.4上重现任何速度改进。也许最近版本的Numpy有了变化。我喜欢一行中的解决方案,但这似乎不如上面的解决方案快。对于50个位置的5个1,与上面的1.7相比,这个解决方案需要6.3秒。问题的关键在于原来的解决方案效率太低。使用排列和排序会大大降低计时特性。排列的数量是
O(a!)
,而组合的数量是
O(a!/(b!(a-b)!)
,和
b!(a-b)可以变得非常非常大。好的,@Veedrac,这是有道理的尴尬的:
from itertools import permutations as perm
a, b = 6, 2
print '\n'.join(sorted([''.join(s) for s in set(t for t in perm(a*'0' + b*'1'))]))