Numpy 在Python中,如何按顺序生成0和1字符串的所有排列?

Numpy 在Python中,如何按顺序生成0和1字符串的所有排列?,numpy,permutation,bits,Numpy,Permutation,Bits,我正在尝试对任意长度的0和1字符串进行置换。我已经看到了很多关于这个主题的答案,它们都是这样做的,因此长度为n的字符串的结果将与n=3的结果类似 000 001 010 011 100 101 110 111 但这不是我需要的 长度为3时,我需要这样: 000 100 010 001 110 101 011 111 对于长度4,这将是: 0000 1000 0100 0010 0001 1100 1010 1001 0110 0101 0011 1110 1101 1011 0111 111

我正在尝试对任意长度的0和1字符串进行置换。我已经看到了很多关于这个主题的答案,它们都是这样做的,因此长度为n的字符串的结果将与
n=3
的结果类似

000
001
010
011
100
101
110
111
但这不是我需要的

长度为3时,我需要这样:

000
100
010
001
110
101
011
111
对于长度4,这将是:

0000
1000
0100
0010
0001
1100
1010
1001
0110
0101
0011
1110
1101
1011
0111
1111
00000
10000
01000
00100
00010
00001
11000
10100
10010
10001
01100
01010
01001
00110
00101
00011
11100
11010
11001
10110
10101
10011
01110
01101
01011
00111
11110
11101
11011
10111
01111
11111
长度5为:

0000
1000
0100
0010
0001
1100
1010
1001
0110
0101
0011
1110
1101
1011
0111
1111
00000
10000
01000
00100
00010
00001
11000
10100
10010
10001
01100
01010
01001
00110
00101
00011
11100
11010
11001
10110
10101
10011
01110
01101
01011
00111
11110
11101
11011
10111
01111
11111
等等

我就是想不出一个算法,有人能帮我吗


编辑:我突然出现,建议我可以在这个网站的其他地方找到答案。我是新来这里的,所以我可能理解不正确,但我在这两个问题中看到的唯一重叠是单词排列。

这对我很有用。但是,它不会按顺序生成元素,而是先生成元素,然后对其进行排序

n = 5
i = np.array(np.indices(n * (2,))).reshape(n, -1)
i[:, np.argsort(i.sum(0)[::-1], kind='mergesort')].T[::-1]
它使用一种稳定的排序方法,即在出现平局时保持原始顺序的排序方法,根据二进制字的数字和对二进制字进行排序

可以使用
itertools

itertools.chain((n*(0,),), (l[0] * (0,) + sum(((1,) + (i-j-1) * (0,) for i, j in zip(l[1:], l[:-1])), ()) + (1,) + (n-l[-1]-1)*(0,) for k in range(1,n+1) for l in itertools.combinations(range(n), k)))
这将循环一个数k(k=0是使用
itertools.chain
的特殊情况和前缀)。对于每个k,它使用
itertools.compositions
创建集合`{0,1,…,n-1}的所有k元素子集l,并将每个子集转换为一个二进制字。这个转换的工作原理是为l的每个元素加一个,并计算中间必须有多少个零。前导零和尾随零必须是特殊情况

示例输出:
numpy

# array([[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0],
         [0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0],
         [1, 0, 0, 1, 0], [1, 0, 0, 0, 1], [0, 1, 1, 0, 0], [0, 1, 0, 1, 0],
         [0, 1, 0, 0, 1], [0, 0, 1, 1, 0], [0, 0, 1, 0, 1], [0, 0, 0, 1, 1],
         [1, 1, 1, 0, 0], [1, 1, 0, 1, 0], [1, 1, 0, 0, 1], [1, 0, 1, 1, 0],
         [1, 0, 1, 0, 1], [1, 0, 0, 1, 1], [0, 1, 1, 1, 0], [0, 1, 1, 0, 1],
         [0, 1, 0, 1, 1], [0, 0, 1, 1, 1], [1, 1, 1, 1, 0], [1, 1, 1, 0, 1],
         [1, 1, 0, 1, 1], [1, 0, 1, 1, 1], [0, 1, 1, 1, 1], [1, 1, 1, 1, 1]])
itertools

list(_)
# [(0, 0, 0, 0, 0), (1, 0, 0, 0, 0), (0, 1, 0, 0, 0), (0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (0, 0, 0, 0, 1),
   (1, 1, 0, 0, 0), (1, 0, 1, 0, 0), (1, 0, 0, 1, 0), (1, 0, 0, 0, 1), (0, 1, 1, 0, 0), (0, 1, 0, 1, 0),
   (0, 1, 0, 0, 1), (0, 0, 1, 1, 0), (0, 0, 1, 0, 1), (0, 0, 0, 1, 1), (1, 1, 1, 0, 0), (1, 1, 0, 1, 0),
   (1, 1, 0, 0, 1), (1, 0, 1, 1, 0), (1, 0, 1, 0, 1), (1, 0, 0, 1, 1), (0, 1, 1, 1, 0), (0, 1, 1, 0, 1),
   (0, 1, 0, 1, 1), (0, 0, 1, 1, 1), (1, 1, 1, 1, 0), (1, 1, 1, 0, 1), (1, 1, 0, 1, 1), (1, 0, 1, 1, 1),
   (0, 1, 1, 1, 1), (1, 1, 1, 1, 1)]

非常感谢你!明天当我再次拥有一台电脑时,我要做的第一件事是:)我现在在打电话。你能解释一下你的itertools代码吗?我试着在n=40和k的范围(1,2)内,这应该只给出41个真正的基本向量,但由于某些原因,它需要永远。你能帮我优化一下吗?@Perm.Questiin我刚刚用
n=40,k在范围(1,2)
内试过,在笔记本电脑上眨了眨眼。你把名单应用到结果上了吗?我来看看如何更好地解释代码。你说得对!我犯了一个错误,这减慢了速度。无论如何,谢谢你:)