1、reshape array(数组重塑)
reshape 的含义是:
👉 在不改变数组中元素值的前提下,改变数组的形状(shape)
数组的形状由每个维度中的元素数量决定,而 reshape 的作用就是:
改变数组的维度数量
改变每个维度中元素的分布方式
不改变元素总数
📌 reshape 不会打乱元素顺序(默认按行优先 / C-order)。
2、reshape:从 1-D 到 2-D
示例:一维数组 → 二维数组
将一个包含 12 个元素 的一维数组 reshape 为 4×3 的二维数组:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12])
newarr = arr.reshape(4, 3)
print(newarr)
输出:
[[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]]
说明:
原数组元素个数:12
新形状:
4 × 3 = 12元素总数保持一致 → reshape 成功
3、reshape:从 1-D 到 3-D
示例:一维数组 → 三维数组
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12])
newarr = arr.reshape(2, 3, 2)
print(newarr)
输出:
[[[ 1 2] [ 3 4] [ 5 6]] [[ 7 8] [ 9 10] [11 12]]]
说明:
最外层维度:2
中间维度:3
最内层维度:2
2 × 3 × 2 = 12
4、reshape 成任何合法形状
核心规则(非常重要)
reshape 前后,元素总数必须完全相等
合法示例
# 8 个元素 arr = np.array([1, 2, 3, 4, 5, 6, 7, 8]) arr.reshape(2, 4) # OK arr.reshape(4, 2) # OK arr.reshape(1, 8) # OK
非法示例(将报错)
import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8]) arr.reshape(3, 3)
错误信息示例:
ValueError: cannot reshape array of size 8 into shape (3,3)
原因:
原数组:8 个元素
新形状:
3 × 3 = 9个元素元素数量不匹配
5、reshape 返回的是 copy 还是 view?
在 可能的情况下,reshape() 返回的是 view(视图),而不是 copy。
示例:判断 reshape 返回值
import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8]) newarr = arr.reshape(2, 4) print(newarr.base)
输出:
[1 2 3 4 5 6 7 8]
说明:
base指向原数组reshape 返回的是 view
修改任一方都会影响另一方
📌 如果 reshape 由于内存不连续等原因无法返回 view,NumPy 才会创建 copy(这是内部实现细节)。
6、未知维度(-1 的用法)
在 reshape 时,可以使用 -1 表示未知维度,由 NumPy 自动计算。
示例:自动推导维度
import numpy as np arr = np.array([1, 2, 3, 4, 5, 6, 7, 8]) newarr = arr.reshape(2, 2, -1) print(newarr)
输出:
[[[1 2] [3 4]] [[5 6] [7 8]]]
说明:
已知:
2 × 2 × ? = 8NumPy 自动计算
? = 2
⚠️ 注意:
👉 一个 reshape 中只能有一个 -1
7、展平数组(Flatten)
展平(flatten) 是将任意多维数组转换为一维数组。
使用 reshape(-1)
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6]])
newarr = arr.reshape(-1)
print(newarr)输出:
[1 2 3 4 5 6]
📌 reshape(-1) 是最推荐、最通用的展平方式。
8、补充说明:其他形状变换方法
NumPy 中还有多种改变数组形状或排列方式的方法:
| 方法 | 说明 |
|---|---|
flatten() | 返回 copy |
ravel() | 尽量返回 view |
transpose() | 转置 |
swapaxes() | 交换轴 |
rot90() | 旋转 |
flip() | 翻转 |
fliplr() | 左右翻转 |
flipud() | 上下翻转 |