优化python中遍历矩阵的代码

优化python中遍历矩阵的代码,python,matrix,Python,Matrix,我正在做一个聚类算法,在这个算法中,我有一个具有(m)行和(n)个特征的数据集。我为数据集创建一个Jaccard相似性矩阵,将我的数据集转换为(m*m)相似性矩阵 创建相似矩阵后,我在矩阵上运行某种逻辑,以找到几个坐标 我写的逻辑实际上遍历了矩阵中的一半元素,但这需要花费大量的时间。因为我是python的新手,所以我的代码不是太优化,而是很直接 请在下面找到我的代码: similarity_dict={} for (i,j), value in np.ndenumerate(matrix

我正在做一个聚类算法,在这个算法中,我有一个具有(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. 
相似性 对于(i,j),数值单位为np.ndenumerate(矩阵_表示_簇): 如果值>阈值且j>=i: 如果我同意: 相似性[i].附加(j) 如果ij: 如果相似性中的j: 相似性[j].附加(一) 其他: 相似性[j]=[i] 其他: 相似性[i]=[j] 聚类矩阵是相似矩阵,如果元素的任何值大于阈值,则元素索引存储在字典中。
我非常感谢您在优化代码方面提供的任何帮助

这应该也能做到,但可能会产生更少的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的原生内容中,您将获得更好的性能

在我看来,您想要或正在尝试构建的内容看起来像一个图表。在这种情况下,您可以使用以下软件包:

内部
networkx
与python字典一起工作,因此它几乎就是您正在尝试构建的,但已经为您构建的

注意:这将创建一个无向图。如果需要,可以通过
nx.DiGraph
行更改
nx.Graph

编辑:更新示例,使sim_矩阵实际上是一个对称矩阵(无向图)

查找有关networkx和numpy的更多信息


希望有帮助

使用一个简单的
y,x=np,其中(矩阵\u表示\u集群>阈值)
?这将为满足条件的位置提供
y
x
坐标向量。这就是你想要的吗?@imaluengo,谢谢你的回复。但我要寻找的是,对于一个特定的行,例如,(0),我想获取所有y轴坐标,如(1(0,0),5(0,5),7(0,7)),它超过阈值,并将其存储在一个字典中的键(0)下。类似地,我想找到每行的所有y轴坐标,并将这些坐标存储在关键行编号下。@imaluengo,好的,我明白了,如果我这样做是否足够优化。np.where(矩阵\u表示\u集群[i]>0.4),我将在其中循环遍历每一行。@Sam:您能提供一个示例输入和预期输出吗?我不明白你在用相似性做什么。首先将其声明为空,然后尝试使用在第一个循环
i
(这是故意的吗?)中使用的相同标记名对其进行迭代,然后尝试分配循环的键,一些值
j
。但是,这本词典是空的。然后你问一个明显不存在的钥匙?我想你还没有在这里分享完整的相似性故事。
>>> 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]])
>>> 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)]