[英]Efficient pairwise computation of identical elements in a large 2D numpy array
我有一個2D numpy數組,有數十萬行和一千個左右的列(假設它是一個N×P數組,N = 200,000,P = 1000)。 這里的目標是計算每對行向量之間相同元素的數量,理想情況下使用numpy數組魔術,不需要我執行199,999 * 100,000個這樣的對的循環。 由於存儲200,000 x 200,000數組可能不可行,因此輸出可能是Nx3稀疏坐標格式,例如,如果輸入采用以下格式:
5 12 14 200 0 45223
7 12 14 0 200 60000
7 6 23 0 0 45223
5 6 14 200 0 45223
得到的(密集的)NxN矩陣M將是(不關心對角線元素):
0 2 2 4
2 0 2 1
2 2 0 3
4 1 3 0
假設基於0的索引,Mij包含初始行i和初始行j之間的相同元素的數量。 因此,預期的稀疏輸出等價物將是:
0 1 2
0 2 2
0 3 4
1 2 2
1 3 1
2 3 3
一種天真的,非常低效的實現方法是:
import itertools
import numpy as np
def pairwise_identical_elements(small_matrix):
n, p = small_matrix.shape
coordinates = itertools.combinations(range(n), 2)
sparse_coordinate_matrix = []
for row1, row2 in itertools.combinations(small_matrix, 2):
idx1, idx2 = next(coordinates)
count = p - np.count_nonzero(row1 - row2)
sparse_coordinate_matrix.append([idx1, idx2, count])
return sparse_coordinate_matrix
我已經研究了距離度量實現,例如scipy和sklearn中的Jaccard相似性,但它們都假設輸入行向量必須是二進制的。 我還嘗試添加第三個維度以使條目成為二進制(例如,條目'9'成為零的向量,在第9個位置具有1)但是存在明顯的內存問題(條目'45223'將需要第三維伸展那么多元素)。
是否有一種高效,可擴展和/或pythonic解決方案使用numpy或scipy以我錯過的方式?
編輯 :在進一步研究scipy之后,我發現了一些與我正在嘗試的東西非常匹配的東西,即帶有漢明度量的scipy.sparse.distance.pdist 。 然而,它以“濃縮”形式返回輸出,並且由於我們試圖避免轉換為完全密集陣列以節省內存,因此問題可能變成:如何將壓縮距離矩陣轉換為稀疏矩陣?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.