HOWTO · NumPy
在 Python 中将 3D 数组转换为 2D 数组
NumPy 包的 reshape()函数可用于在 Python 中将 3D 数组转换为 2D 数组。
本页内容
使用 NumPy 的 numpy.reshape() 操作可在保留数组值的同时,将 3D 数组转换为 2D 数组。请选择一个维度乘积与输入元素总数相同的 2D 形状。例如,形状为 (4, 2, 2) 的数组重塑为 (4, 4) 后,第一轴上的每组数据各占一行,其余两轴合并为列。具体如何分组,取决于数据的含义。
理解 3D 数组的形状
3D NumPy 数组有三个轴,arr.shape 会以元组形式报告每个轴的长度。这些轴并不天然代表深度、高度和宽度;它们的含义由数据决定。例如,图像数组的各轴可能表示高度、宽度和颜色通道,而模拟数据的各轴可能表示时间、行和列。重塑之前,请先确定哪些维度应成为行,哪些维度应合并为列。重塑会改变轴的组织方式,但不会改变数组值。
使用 NumPy reshape() 将 3D 数组转换为 2D 数组
调用 reshape(),并传入包含目标行数和列数的元组。此示例生成从 0 到 15 的数值,将它们排列成 (4, 2, 2) 数组,再把末尾两个轴合并为四列。
运行此示例:
本节中的代码以及显示的标签或输出仍为英文。
import numpy as np
arr = np.arange(16).reshape(4, 2, 2)
arr_2d = arr.reshape(4, 4)
print("Input shape:", arr.shape)
print("Output shape:", arr_2d.shape)
print(arr_2d)
Input shape: (4, 2, 2)
Output shape: (4, 4)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
目标形状 (4, 4) 表示四行四列。NumPy 会按照选定的索引顺序保留这些值,因此新数组的行会根据所选轴对原始值进行分组。如果任务需要不同的分组方式,请选用其他目标形状;对于所有 3D 数据集,并不存在唯一正确的 2D 布局。
根据输入数组推导 2D 形状
维度不固定时,可以从 arr.shape 读取维度,而不必将其写死。如果输入形状为 (a, b, c),且每个第一轴切片都应成为一行,那么输出形状就是 (a, b * c)。在代码中,将 arr.shape 赋给 rows, height, width,然后使用 arr.reshape(rows, height * width)。这样会保留第一轴,并合并第二轴和第三轴。如果你希望行对应其他轴,请先调整或转置轴,再选择符合该数据解释方式的输出形状。
你也可以将某个维度写为 -1,让 NumPy 自动推导,例如 arr.reshape(arr.shape[0], -1)。NumPy 会根据元素总数和其余已指定的维度计算该维度。只能使用一个待推导维度,这样目标形状才明确。
元素顺序:C 和 Fortran 风格
默认情况下,reshape() 使用 C 风格索引顺序。这意味着 NumPy 读取输入值并放入结果时,最后一个轴变化最快。传入 order='F' 则会使用 Fortran 风格索引顺序,此时第一个轴变化最快。order 参数控制重塑时采用的索引顺序;它本身并不保证特定的物理内存布局。大多数转换使用默认值即可。只有在结果中的值应按 Fortran 约定排列时,才选择 Fortran 顺序。
形状兼容性与常见错误
输入维度的乘积必须等于所请求输出维度的乘积。形状为 (4, 2, 2) 的输入包含 16 个元素,因此 (4, 4) 或 (2, 8) 都能容纳这些值,而 (4, 5) 则不行。如果请求的形状与元素总数不兼容,NumPy 会引发 ValueError。排查此错误时,请检查 arr.size 或计算各维度的乘积。还要确认所选的行列分组符合数据的含义:形状在数学上兼容,并不代表它对后续操作来说就是合适的排列方式。
有关函数参数和行为,请参阅 NumPy 官方 reshape API 参考。