You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 05:15:29