簡體   English   中英

在非常大的數據集上用python生成n選擇2個組合

[英]Generate n choose 2 combinations in python on very large data sets

我需要創建n選擇2個組合,並且當前正在使用pythons itertools.combinations模塊。

對於30,000個字符串的單個列表,創建組合需要花費幾個小時,並使用大量的ram,即

list(itertools.combinations(longlist,2))

是否有一種生成組合的方法,該組合可能針對內存中的大對象進行了更好的優化? 或者,有沒有一種方法可以使用numpy來加快過程?

您可以通過使用二項式系數(30k選擇2)來立即知道有多少種組合來解決此問題= math.factorial(30000)//(math.factorial(2)*math.factorial(30000-2)) = 449985000組合

表示itertools返回了一個生成器,因此您可以對其進行迭代,而無需將內存中的所有組合加載到一個大列表中

我會使用基於np.triu_indices的生成器
這些是nxn方陣的上三角的索引,其中n = len(long_list)

問題是首先創建整個索引集。 itertools不會這樣做,只會一次生成一個組合。

def combinations_of_2(l):
    for i, j in zip(*np.triu_indices(len(l), 1)):
        yield l[i], l[j]

long_list = list('abc')
c = combinations_of_2(long_list)
list(c)

[('a', 'b'), ('a', 'c'), ('b', 'c')]

一次獲得所有

a = np.array(long_list)
i, j = np.triu_indices(len(a), 1)
np.stack([a[i], a[j]]).T

array([['a', 'b'],
       ['a', 'c'],
       ['b', 'c']], 
      dtype='<U1')

定時
long_list = pd.DataFrame(np.random.choice(list(ascii_letters), (3, 1000))).sum().tolist()
在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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