簡體   English   中英

在 Python 中生成唯一排列的最佳方法是什么?

[英]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 循環。

有沒有更聰明或更優雅的方法來做到這一點?

  • 這是一個二進制數,每個唯一的二進制數對應一個唯一的十進制數。
  • 有 10 個地方,就有 2^10 = 1024 個唯一。
  • 從這1024個中選10個不放回
  • 將十進制轉換為二進制

生成 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM