簡體   English   中英

優化在python中遍歷矩陣的代碼

[英]optimizing code for traversing a matrix in python

我正在做一個聚類算法,其中我有一個包含(m)行和(n)特征的數據集。 我為數據集創建了一個Jaccard相似度矩陣,將我的數據集轉換為(m * m)相似度矩陣。

在創建相似度矩陣之后,我在矩陣上運行某個邏輯以找到幾個坐標。

我寫的邏輯實際上遍歷了矩陣中的一半元素,但需要花費大量時間。 因為我是python的新手,我的代碼不是太優化而是直接的。

請在下面找到我的代碼:

    similarity_dict={}
for (i,j), value in np.ndenumerate(matrix_for_cluster):
    if value>threshold and j>=i:
        if i in similarity_dict:
            similarity_dict[i].append(j)
            if i<>j:
                if j in similarity_dict:
                    similarity_dict[j].append(i)
                else:
                    similarity_dict[j]=[i]                    
        else:  
            similarity_dict[i]=[j]


Matrix for cluster is the similarity matrix, If any of the element's value is greater than the threshold value then the element index is stored in a dictionary. 

我非常感謝有關優化代碼的任何幫助

在我看來,你想要或正在嘗試構建的東西看起來像一個圖形。 在這種情況下,您可以使用networkx包:

>>> sim_matrix
array([[0, 1, 0, 2, 2],
       [1, 0, 2, 0, 1],
       [0, 2, 0, 1, 2],
       [2, 0, 1, 0, 0],
       [2, 1, 2, 0, 0]])
>>> sim_matrix[sim_matrix < 2] = 0 # apply your threshold
>>> sim_matrix
array([[0, 0, 0, 2, 2],
       [0, 0, 2, 0, 0],
       [0, 2, 0, 0, 2],
       [2, 0, 0, 0, 0],
       [2, 0, 2, 0, 0]])

使用sim_matrix一個numpy數組:

>>> import networkx as nx
>>> graph = nx.Graph(sim_matrix)
>>> graph.nodes()
[0, 1, 2, 3, 4]
>>> graph.edges(2)
[(2, 1), (2, 4)]
>>> graph.edges(4)
[(4, 0), (4, 2)]

在內部networkx與python詞典一起使用,所以它幾乎就是你想要構建的,但已經為你構建了。

注意:這將創建一個不定向的圖形。 如果你想要它的方向性,用nx.DiGraph線改變nx.Graph

編輯:更新了示例,使sim_matrix實際上成為對稱矩陣(非定向圖)。

在此處查找有關networkx和numpy的更多信息。

希望能幫助到你!

這應該做同樣的事情,但可能產生更少的VM操作:

for (i,j), value in np.ndenumerate(matrix_for_cluster):
    if value>threshold and j>=i:
        similarity_dict.setdefault(i,[]).append(j)
        if i != j:
           similarity_dict.setdefault(j,[]).append(i)

但總的來說,scipy和numpy(你已經使用我已經看到的)有更多優化的矩陣相似性和類似的東西,如果你能把所有的工作保存在num / scipy的本地東西中,你會好得多性能。

暫無
暫無

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

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