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