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

如何高效将二维NumPy数组转换为指定结构的三列DataFrame?

高效将二维NumPy矩阵转换为行/列索引+值的DataFrame

这有几个实用且高效的方法可以实现你要的转换,我平时处理这类需求时常用这些方案:

方法1:用Pandas的stack()(最简洁直观)

这个方法代码量最少,逻辑清晰,适合大多数常规场景:

import numpy as np
import pandas as pd

arr = np.arange(0, 12).reshape(3,4)
# 先把矩阵转为DataFrame,再用stack把列索引转成内层行索引
df = pd.DataFrame(arr).stack().reset_index()
# 重命名列名到你需要的X/Y/Z
df.columns = ['X', 'Y', 'Z']

stack()会自动把原矩阵的列索引转为二级行索引,之后reset_index()把这两个索引都转成普通列,最后重命名即可。

方法2:用NumPy生成索引(性能最优,适合大矩阵)

如果你的矩阵规模很大,这个方法的速度会比纯Pandas操作快很多,因为全程用NumPy的向量化操作:

import numpy as np
import pandas as pd

arr = np.arange(0, 12).reshape(3,4)
# 生成和原矩阵同形状的行、列索引矩阵
rows, cols = np.indices(arr.shape)
# 把所有矩阵展平成一维数组,再构建DataFrame
df = pd.DataFrame({
    'X': rows.ravel(),
    'Y': cols.ravel(),
    'Z': arr.ravel()
})

np.indices直接生成对应位置的行、列索引,ravel()把多维数组展平为一维,整个过程都是底层的向量化运算,处理大矩阵时效率优势很明显。

方法3:用Pandas的melt()(备选方案)

这个方法逻辑稍绕一点,但也是可行的,适合已经熟悉melt用法的场景:

import numpy as np
import pandas as pd

arr = np.arange(0, 12).reshape(3,4)
# 先把行索引转为普通列,再用melt把列转成行
df = pd.DataFrame(arr).reset_index().melt(id_vars='index', var_name='Y', value_name='Z')
# 重命名行索引列为X
df = df.rename(columns={'index': 'X'})

总结

  • 小矩阵/追求代码简洁:选方法1
  • 大矩阵/追求性能:选方法2

内容的提问来源于stack exchange,提问作者timbmg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:23:51