我有一個由“12 個 3 組合”創建的 220 個元組的串列。Python 中有沒有辦法從這個元組串列中采樣,這樣我選擇的每個樣本都包含集合中的所有 12 個元素?
例如,如果集合是 [a,b,c,d,e,f,g,h,i,j,k,l],則隨機選擇應該看起來像 [(a,b,c), (d ,e,f), (g,h,i), (j,k,l)]。我嘗試了以下
for y in range(4):
for x in range(2):
print(random.sample(list, 4))
但是很多樣本并不具備母集的所有元素。
uj5u.com熱心網友回復:
盡管時間復雜度很大,只有 12 個專案,但我可以安全地保證代碼運行時間不到一兩秒鐘。
作為回報,此代碼可以為您提供純粹且無偏的 random,并且您可以根據需要生成任意數量的樣本。您生成的樣本越多,原始集合的專案越少,您的代碼運行所需的時間就越短。
def generate(n, lst):
if n < len(lst) // 3:
print(f'"It is impossible to generate {n} samples."')
else:
while True:
stack = None
for _ in range(n):
tup = np.random.choice(lst, size=3, replace=False)
if stack is None:
stack = tup
else:
stack = np.vstack((stack, tup))
if len(np.unique(stack.flatten())) == len(lst):
return list(tuple(i) for i in stack)
基本上,它會生成n樣本,直到樣本滿足條件。
結果
用上面的代碼生成六個樣本給出了結果。
>>> lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> generate(6, lst)
[(5, 0, 2), (8, 1, 4), (0, 4, 7), (10, 7, 2), (9, 11, 2), (3, 6, 1)]
生成四個樣本給出以下結果。
>>> lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> generate(4, lst)
[(7, 10, 11), (0, 4, 3), (1, 8, 5), (2, 9, 6)]
三個樣本不可能滿足條件。
>>> lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> generate(3, lst)
"It is impossible to generate 3 samples."
uj5u.com熱心網友回復:
混洗原始集合/串列,然后從該混洗串列中取出 3 元組怎么樣?
import random
lst = range(12) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
lst_shuffle = random.sample(lst, k=len(lst)) # shuffle the list
smp = [tuple(lst_shuffle[i:i 3]) for i in range(0, len(lst_shuffle), 3)] # make chunks
print(smp) # e.g., [(0, 2, 10), (3, 5, 4), (11, 7, 8), (1, 9, 6)]
我相信這在概率上等效的同時更節省記憶體。
uj5u.com熱心網友回復:
您可以使用random.shuffle再利用zip和tuple并得到你想要的東西:
>>> import random
>>> random.seed(123)
>>> lst = list(range(12))
>>> random.shuffle(lst)
>>> lst
[7, 5, 9, 2, 3, 8, 11, 10, 6, 1, 4, 0]
>>> tuple(zip(lst[::3], lst[1::3], lst[2::3]))
((7, 5, 9), (2, 3, 8), (11, 10, 6), (1, 4, 0))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/334325.html
標籤:Python
上一篇:GPU不適用于Pytorch
下一篇:串列python的排列
