生成不重复的二进制序列

lea*_*ner 6 python random performance numpy python-3.x

我正在尝试生成仅包含0's 和1's 的序列。我编写了以下代码,并且可以正常工作。

import numpy as np

batch = 1000
dim = 32

while 1:
    is_same = False
    seq = np.random.randint(0, 2, [batch, dim])
    for i in range(batch):
        for j in range(i + 1, batch):
            if np.array_equal(seq[i], seq[j]):
                is_same = True
    if is_same:
        continue
    else:
        break
Run Code Online (Sandbox Code Playgroud)

我的batch变量是数以千计。上面的这个循环大约需要 30 秒才能完成。这是另一个for循环的数据生成部分,该循环运行了大约 500 次迭代,因此非常慢。有没有更快的方法来生成这个序列列表而不重复?谢谢。

期望的结果是一个batch_size序列的集合,每个序列的长度dim只包含0s 和1s,这样集合中没有两个序列是相同的。

bur*_*ran 3

生成inbatch中的数字 将这些数字转换为二进制,然后转换为a 和s 的序列。intrange(0, 2**dim + 1)01

from random import sample

def generate(batch, dim):
    my_sample = [f'{n:0>32b}' for n in sample(range(2**dim+1), batch)]
    return [[int(n) for n in item] for item in my_sample]

def generate2(batch, dim):
    return [list(map(int, f'{n:0>32b}')) for n in sample(range(2**dim+1), batch)]
Run Code Online (Sandbox Code Playgroud)

第二个有点快

from timeit import timeit
print(timeit("generate(1000, 32)", setup="from __main__ import generate", number=100))
print(timeit("generate2(1000, 32)", setup="from __main__ import generate2", number=100))
Run Code Online (Sandbox Code Playgroud)

输出

1.4956848690007973
1.1187048860001596
Run Code Online (Sandbox Code Playgroud)