[英]What's the best way to generate unique permutations in Python?
對於每個項目,我在 0 和 1 之間有 2 個選擇,我將 N 個元素一個接一個地排序,生成一個獨特的組合。
所以像這樣的東西(序列長度=10):
0, 1, 0, 1, 0, 1, 0, 1, 0, 1
0, 0, 0, 1, 0, 1, 0, 1, 0, 1
0, 1, 1, 1, 0, 1, 0, 1, 0, 1
1, 1, 1, 1, 0, 1, 0, 1, 0, 1
如您所見,這些都是唯一的排列。 我將有 10000 個這樣的排列(例如)。 但關鍵信息是我不需要所有的排列,而是只保存一組有限的排列,最好是無序的,所以它更“隨機”一點。
我目前的解決方案是生成 0 和 1 之間的隨機數,並將它們生成一個最多 N 個元素的數組中的 append 個。 然后將這個數組變成一個字符串,如果這個字符串還沒有添加到我上面的列表中,那么添加這個,否則重復相同的步驟來生成不同的排列。
所以這意味着使用 while 循環。
有沒有更聰明或更優雅的方法來做到這一點?
生成 5 個唯一樣本,每個樣本 10 個數字
import numpy as np
n_digits = 10
n_sample = 5
for c in np.random.choice(np.power(2,n_digits), size=n_sample, replace=False):
c = int("{0:b}".format(c))
print (str(c).zfill(n_digits))
樣品運行
0100011110
0110110011
0100110001
1110011100
1110101011
上面的代碼速度很快,但由於np.power(2,n_digits)
導致溢出,因此不會擴展到更大的數字, np.random.choice
將用完 memory。
為了將它擴展到非常大的序列,我們可以使用有點慢但非常不錯的機制,如下所示
n_digits = 200
n_sample = 10000
choices = []
cache = {}
while len(choices) < n_sample:
c = np.random.randint(0,2,(n_digits))
k = c.tostring()
if not k in cache:
cache[k] = True
choices.append(c)
%timeit
返回
27.4 ns ± 10.1 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
這是相當不錯的。
choices
是 numpy arrays 的列表,如果你想將它轉換成文本,你可以使用
for i in range(len(choices)):
choices[i] = np.array2string(choices[i], separator='')[1:-1].replace("\n", "").replace(" ", "")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.