Tensor/Numpy/DataFrame之间的转换操作

PyTorch Tensor、Pandas DataFrame 与 NumPy Array 数据转换指南

在深度学习与数据科学开发中,数据常需要在 Pandas(数据处理与清洗)NumPy(数值计算与矩阵操作)PyTorch(模型训练与张量计算) 三者之间流动。本文总结了两两转换的标准操作、注意事项及实际开发中的经典连续转换场景。

一、 两两转换操作与代码示例

1.1 NumPy <-> PyTorch Tensor

① NumPy -> Tensor

  • 推荐方式torch.from_numpy(array)
  • 替代方式torch.tensor(array)
1
2
3
4
5
6
7
8
9
10
import torch
import numpy as np

np_arr = np.array([1.0, 2.0, 3.0])

# 推荐:共享内存(零拷贝)
tensor_shared = torch.from_numpy(np_arr)

# 副本:深拷贝(分配新内存)
tensor_copy = torch.tensor(np_arr)

② Tensor -> NumPy

  • 标准方式tensor.numpy()
1
2
3
4
5
6
# 基础转换
np_arr = tensor_shared.numpy()

# 安全转换(处理 GPU 张量与含梯度的张量)
tensor_gpu_grad = torch.randn(3, requires_grad=True).cuda()
np_arr_safe = tensor_gpu_grad.detach().cpu().numpy()

1.2 NumPy <-> Pandas DataFrame

① NumPy -> DataFrame

  • 标准方式pd.DataFrame(data)
1
2
3
4
5
import pandas as pd

np_arr = np.array([[81, 62], [86, 84]])

df = pd.DataFrame(np_arr, columns=['Chinese', 'Math'], index=['zhangsan', 'lisi'])

② DataFrame -> NumPy

  • 推荐方式df.to_numpy()
  • 替代方式df.values(官方已不推荐)
1
2
# 推荐:显式转换,支持指定 dtype
np_arr = df.to_numpy()

1.3 Pandas DataFrame <-> PyTorch Tensor

Pandas 与 PyTorch 没有直接的原生转换 API,必须以 NumPy 为桥梁 进行间接转换。

① DataFrame -> Tensor

1
2
# DataFrame -> NumPy -> Tensor
tensor_data = torch.from_numpy(df.to_numpy())

② Tensor -> DataFrame

1
2
# Tensor -> NumPy -> DataFrame
df_data = pd.DataFrame(tensor_grad.detach().cpu().numpy(), columns=['col1', 'col2'])

二、 核心注意事项与踩坑指南

转换路径 核心注意事项
torch.from_numpy() 内存共享(零拷贝):修改 NumPy 数组会同步修改 Tensor,反之亦然。如果需要独立数据,请追加 .clone()
Tensor.numpy() CPU & 梯度限制
1. 若 Tensor 在 GPU 上,必须先 .cpu() 移至内存;
2. 若 Tensor 带有梯度追踪(requires_grad=True),必须先 .detach() 截断计算图。
df.to_numpy() 数据类型一致性:若 DataFrame 中包含混合类型(如 intstring),转出的 NumPy 数组类型会退化为 object,传入 PyTorch 时会引发类型报错。
默认浮点精度 float64 vs float32
1. Pandas / NumPy 默认浮点数精度是 float64 (double);
2. PyTorch 深度学习模型默认权重精度是 float32 (float)。
从 DataFrame/NumPy 转 Tensor 后,建议显式转换类型 .float().to(torch.float32),避免模型训练时报类型不匹配错误。

三、 实际开发场景下的常见综合连续转换

在真实的机器学习/深度学习 Pipeline 中,数据通常遵循 “读取清洗 \(\to\) 模型预测 \(\to\) 结果保存” 的流转路线。

场景:从 CSV 读取数据,传入 PyTorch 模型预测,并将结果追加回 CSV 保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import torch
import pandas as pd
import numpy as np

# 1. 原始数据阶段 (Pandas DataFrame)
df = pd.read_csv('input_data.csv')

# 提取特征列(假设前 4 列为特征)
features_df = df.iloc[:, :4]

# 2. 数据清洗与预处理阶段 (DataFrame -> NumPy)
# 转换成 NumPy 数组,便于做归一化或维度变形
features_np = features_df.to_numpy()

# 3. 模型输入准备阶段 (NumPy -> Tensor)
# 转换成 Tensor,并确保类型为 float32,同时增加 Batch 维度 (如需)
inputs_tensor = torch.from_numpy(features_np).float()

# 假设模型部署在 GPU 上
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
inputs_tensor = inputs_tensor.to(device)

# 4. 模型推理阶段 (Tensor -> Tensor)
# 假设 model 已定义并加载了权重
model.eval()
with torch.no_grad():
outputs_tensor = model(inputs_tensor) # 预测结果,形状为 (N, 1)

# 5. 后处理与导出阶段 (Tensor -> CPU NumPy -> DataFrame)
# 将预测结果取回 CPU,转为 NumPy 数组
predictions_np = outputs_tensor.cpu().numpy()

# 将预测结果追加为 DataFrame 的新列,并保存到新的 CSV
df['prediction'] = predictions_np
df.to_csv('output_predictions.csv', index=False)

print("推理完成,结果已保存!")

Tensor/Numpy/DataFrame之间的转换操作
https://jiangsanyin.github.io/2026/09/11/Tensor-Numpy-DataFrame之间的转换操作/
作者
sanyinjiang
发布于
2026年9月11日
许可协议