[英]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.