一、三者关系与比较
(一)能力递进
普通列表 list
↓(变成结构化数值数组)
numpy 数组 np.array
↓(加上 GPU/自动求导/深度学习能力)
张量 Tensor (PyTorch / TensorFlow)
1)普通列表:list
python
data = [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
]
- 只是容器,用来装东西
- 没有
.shape,不能reshape - 不能批量加减乘除
- 机器学习模型不能直接用
2)numpy 数组:np.array(ndarray)
python
import numpy as np
arr = np.array(data)
- 是多维数组,数学上就是张量结构
- 有
.shape、可reshape - 支持矩阵运算、拼接、均值等
- 用于数据处理、特征工程、Stacking 构造影子数据集
- 一般在 CPU 上运行
在数学定义里:np.array 就是张量
在工程叫法里:大家习惯叫它"数组"
3)深度学习中张量:torch.Tensor / tf.Tensor
python
import torch
tensor = torch.tensor(data)
# 或者从 numpy 转换
tensor = torch.from_numpy(arr)
- 结构和 np.array 几乎一样
- 额外支持:GPU 加速、自动求导、反向传播
- 是神经网络的标准输入格式
- 用于训练深度学习模型
(二)区别汇总
| 结构 | 数学身份 | 能否 reshape | 能否进模型 | 运行设备 |
|---|---|---|---|---|
| list | 无结构容器 | ❌ 不能 | ❌ 不行 | CPU |
| np.array | 多维数组/张量 | ✅ 可以 | ⚠️ 传统ML可以 | CPU |
| Tensor | 张量 | ✅ 可以 | ✅ 深度学习专用 | GPU/CPU |
- list 只是 Python 普通列表,不是数值数组。
- np.array 是数值型多维数组,数学上就是张量,适合数据处理与传统机器学习。
- Tensor 是专为深度学习设计的张量,支持 GPU 和自动求导。
它们的维度结构完全一致,只是用途和能力逐级增强。
二、三者(list / np.array / tensor) 的 shape 与 reshape
1. 普通列表:list
python
lst = [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
]
shape
- 没有
.shape属性 - 你只能看到是"列表套列表"
- 无法直接知道维度、行列数
reshape
- 完全不支持 reshape
- 没有任何变形能力
- 想变形必须先转成 np.array 或 tensor
2. NumPy 数组:np.array(ndarray)
python
import numpy as np
arr = np.array(lst)
shape
- 有
.shape - 上面例子:
(3, 4) - 清晰:3 行 4 列
reshape
- 完全支持
- 最常用:
reshape(-1, 1)→ 变成一列reshape(1, -1)→ 变成一行reshape(4, 3)→ 重新排列
- 元素总数永远不变
- 变形后仍然是 np.array
python
arr.reshape(-1, 1).shape # (12, 1)
3. 深度学习张量:torch.Tensor(以 PyTorch 为例)
python
import torch
ts = torch.tensor(lst)
shape
- 有
.shape - 同样是
(3, 4) - 用法和 np.array 几乎一样
reshape
-
同样支持 reshape(...)
-
语法完全一致:
pythonts.reshape(-1, 1) # 变成一列 ts.reshape(4, 3) -
变形后仍然是 tensor
-
可在 GPU 上运行
一句话总结
-
list
- 无 shape
- 不能 reshape
-
np.array
- 有 shape
- 能 reshape
- 数学上 = 张量
- 用于数据处理、Stacking
-
tensor
- 有 shape
- 能 reshape
- 深度学习专用张量
- 支持 GPU / 自动求导
三、重塑形状reshape
下面二行做的事情一模一样:
python
np.array(lst).reshape(-1, 1) # numpy 数组变一列
torch.tensor(lst).reshape(-1, 1) # 张量变一列
只有 list 不行:
python
lst.reshape(-1, 1) # 报错!
reshape 用法
口诀
元素总数不变,形状随便排;
-1 自动算,不用你瞎猜。
示例
以np.array的reshape 为例。
一维数组 reshape 示例
python
import numpy as np
a = np.array([1,2,3,4,5,6]) # shape=(6,)
-
a.reshape(2, 3)
→ 2行3列[[1 2 3]
[4 5 6]] -
a.reshape(3, 2)
→ 3行2列[[1 2]
[3 4]
[5 6]] -
a.reshape(-1, 1)
→ 自动6行,固定1列[[1]
[2]
[3]
[4]
[5]
[6]]
二维数组 reshape 示例
python
b = np.array([[1,2,3],
[4,5,6]]) # shape=(2,3)
-
b.reshape(3, 2)→ 变回 3行2列
-
b.reshape(1, 6)→ 1行6列(扁平)
-
b.reshape(-1)→ 一维数组
[1,2,3,4,5,6] -
b.reshape(-1, 1)→ 全部拉成 1 列
[[1]
[2]
[3]
[4]
[5]
[6]]
三维数组 reshape 示例
python
c = np.array([[[1,2],[3,4]],
[[5,6],[7,8]]]) # shape=(2,2,2)
-
c.reshape(4, 2)→ 二维 4行2列
-
c.reshape(2, 4)→ 二维 2行4列
-
c.reshape(-1)→ 一维
[1,2,3,4,5,6,7,8] -
c.reshape(-1, 1)→ 统一变成 1 列二维数组
reshape中的-1 到底是什么?
reshape(x, -1):你定行数,列数自动算reshape(-1, x):你定列数,行数自动算reshape(-1):全部拉平成一维