NumPy 中,reshape(重塑数组形状) 是最常用、也是最容易出错的操作之一。本文将系统介绍 NumPy 数组 reshape 的基本概念、使用规则、常见用法以及注意事项。

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 × ? = 8

  • NumPy 自动计算 ? = 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()上下翻转

推荐文档