簡體   English   中英

在大型2D numpy陣列中對相同元素進行有效的成對計算

[英]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 然而,它以“濃縮”形式返回輸出,並且由於我們試圖避免轉換為完全密集陣列以節省內存,因此問題可能變成:如何將壓縮距離矩陣轉換為稀疏矩陣?

正如評論中所說,scipy的'hamming'的pdist是解決這個問題的最簡單有效的方法,無論是考慮空間還是考慮cpu時間。

你的壓縮輸出將無法提高內存效率。 實際上,當寫入“稀疏”格式時,需要一個(N*(N-1)/2, 3)矩陣,與pdist返回的N*(N-1)/2向量pdist

暫無
暫無

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

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