如何高效将Numpy相似度矩阵转换为Pandas DataFrame?
问题描述
我有一个存储在Numpy数组中的相似度矩阵,需要将其转换为三列格式的Pandas DataFrame(列分别为Item1、Item2、相似度值,每行对应矩阵中一对元素的相似度)。目前用嵌套循环实现,但效率极低,代码如下:
sim_npy = np.load('sim.npy') row=0 for i in range(100): for j in range(100): df_tsc.loc[row] = list(np.array(['Item'+str(i), 'Item'+str(j),str(sim_npy[i][j])])) row = row + 1
求更高效的转换方法。
高效解决方案
利用Numpy的向量化操作替代嵌套循环,能大幅提升转换效率,具体实现如下:
import numpy as np import pandas as pd # 加载相似度矩阵 sim_npy = np.load('sim.npy') matrix_size = sim_npy.shape[0] # 生成所有Item标签 item_labels = [f'Item{k}' for k in range(matrix_size)] # 生成所有Item对的笛卡尔积标签 item1, item2 = np.meshgrid(item_labels, item_labels, indexing='ij') # 构造目标DataFrame df_tsc = pd.DataFrame({ 'Item1': item1.flatten(), 'Item2': item2.flatten(), '相似度': sim_npy.flatten() })
核心优化说明:
- 用
np.meshgrid一次性生成所有元素对的标签,避免循环遍历 - 通过
flatten()直接扁平化矩阵和标签数组,消除逐行赋值的性能开销 - 直接通过字典构造DataFrame,比
loc逐行插入的效率高一个数量级以上
如果你的相似度矩阵是对称的(即sim_npy[i][j] = sim_npy[j][i]),还可以进一步优化只保留非重复的元素对(比如上三角部分):
# 生成上三角掩码(k=1表示不含对角线元素) tri_mask = np.triu(np.ones((matrix_size, matrix_size)), k=1).astype(bool) df_tsc = pd.DataFrame({ 'Item1': item1[tri_mask], 'Item2': item2[tri_mask], '相似度': sim_npy[tri_mask] })
内容的提问来源于stack exchange,提问作者nuttychan
相关产品推荐
相关产品推荐

