一、flatten () 核心定义
flatten() 是 numpy 数组(ndarray)的内置方法,作用是将任意维度(一维 / 二维 / 三维 / 高维)的数组 “展平” 为一维数组,并返回一个新的独立数组(不与原数组共享内存)。
简单说:无论原数组是 2 行 3 列的二维数组,还是 2×3×4 的三维数组,flatten() 都会把所有元素按指定顺序排成一行,且修改展平后的数组不会影响原数组。
核心语法
flattened_arr = arr.flatten(order='c')
arr:待展平的 numpy 数组(任意维度);order:可选参数,指定元素展平的顺序(默认'c');- 返回值:一维数组(新数组,独立内存)。
二、基础用法(不同维度数组展平)
示例 1:二维数组展平(最常用)
import numpy as np
# 原始二维数组(2行3列)
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print("原始二维数组:\n", arr_2d)
print("原始形状:", arr_2d.shape) # (2, 3)
# 展平为一维数组(默认顺序)
arr_flat = arr_2d.flatten()
print("\n展平后的一维数组:", arr_flat)
print("展平后形状:", arr_flat.shape) # (6,)输出结果:
原始二维数组:
[[1 2 3]
[4 5 6]]
原始形状: (2, 3)
展平后的一维数组: [1 2 3 4 5 6]
展平后形状: (6,)
示例 2:三维数组展平
三维数组可理解为 “多个二维矩阵的集合”,flatten() 会按顺序把所有矩阵的元素拼接成一维:
import numpy as np
# 原始三维数组(2个3行2列的矩阵)
arr_3d = np.array([
[[1, 2], [3, 4], [5, 6]],
[[7, 8], [9, 10], [11, 12]]
])
print("原始三维数组形状:", arr_3d.shape) # (2, 3, 2)
# 展平为一维
arr_flat = arr_3d.flatten()
print("展平后的数组:", arr_flat)
print("展平后形状:", arr_flat.shape) # (12,)输出结果:
原始三维数组形状: (2, 3, 2)
展平后的数组: [ 1 2 3 4 5 6 7 8 9 10 11 12]
展平后形状: (12,)
三、关键参数:order(展平顺序)
order 参数决定了元素展平的读取顺序,核心有 3 个取值,其中 'c' 和 'f' 最常用:
| order 值 | 含义 | 读取顺序 | 示例(二维数组 [[1,2],[3,4]]) |
|---|---|---|---|
| 'c'(默认) | c 风格(行优先) | 先填满每一行,再读下一行 | [1,2,3,4] |
| 'f' | fortran 风格(列优先) | 先填满每一列,再读下一列 | [1,3,2,4] |
| 'a' | 按数组在内存中的存储顺序 | 若数组是 c 风格存储则等价于 'c',否则等价于 'f' | 通常和 'c' 一致 |
示例:不同 order 的展平效果
import numpy as np
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
# c风格(行优先,默认)
flat_c = arr_2d.flatten(order='c')
# f风格(列优先)
flat_f = arr_2d.flatten(order='f')
print("c风格展平(行优先):", flat_c) # [1 2 3 4 5 6]
print("f风格展平(列优先):", flat_f) # [1 4 2 5 3 6]四、flatten () vs reshape (-1)(核心对比!)
这是新手最易混淆的两个展平方法,核心差异在于内存是否共享,以下是详细对比:
| 特性 | flatten() | reshape(-1) |
|---|---|---|
| 返回值 | 新的独立数组(拷贝) | 原数组的视图(共享内存) |
| 内存占用 | 高(复制一份数据) | 低(仅修改形状,不复制数据) |
| 修改影响 | 修改展平数组,原数组不变 | 修改展平数组,原数组同步修改 |
| 速度 | 较慢(需拷贝数据) | 极快(仅调整形状) |
| 语法 | arr.flatten() | arr.reshape(-1) |
实战对比示例:
import numpy as np
arr = np.array([[1, 2], [3, 4]])
# 1. 使用flatten()(独立数组)
flat_flatten = arr.flatten()
flat_flatten[0] = 99 # 修改展平数组
print("flatten修改后 - 展平数组:", flat_flatten) # [99 2 3 4]
print("flatten修改后 - 原数组:\n", arr) # [[1 2],[3 4]] → 原数组不变
# 2. 使用reshape(-1)(共享内存)
flat_reshape = arr.reshape(-1)
flat_reshape[0] = 99 # 修改展平数组
print("\nreshape修改后 - 展平数组:", flat_reshape) # [99 2 3 4]
print("reshape修改后 - 原数组:\n", arr) # [[99 2],[3 4]] → 原数组同步修改五、适用场景(该用 flatten 还是 reshape?)
场景 1:优先用 flatten () 的情况
需要保留原数组不变,避免修改展平数组影响原数据;
展平后需对数据做大量修改,且不想污染原始数据;
示例(数据备份 / 独立处理):
# 原始温度数据(二维)
temp_2d = np.random.normal(5, 6, (31, 24)).round(1)
# 展平为一维用于统计,且不修改原数据
temp_flat = temp_2d.flatten()
temp_flat[0] = 0 # 仅修改拷贝,原数据不受影响
print("原数据第一值:", temp_2d[0,0]) # 仍为原始温度值场景 2:优先用 reshape (-1) 的情况
仅需临时展平数组(如计算总和、均值),无需保留展平后的数组;
处理大规模数据(如百万级元素),追求速度和内存效率;
示例(快速统计):
# 大规模数据(10万行×10列)
big_arr = np.random.rand(100000, 10)
# 快速展平计算总和(无需拷贝,速度快)
total = big_arr.reshape(-1).sum()
print("总和:", total)六、进阶用法:高维数组展平 + 指定顺序
对于高维数组(如 4 维图像数据),可通过 order 参数控制展平顺序,适配不同业务需求:
import numpy as np
# 4维数组:2张图片 × 32行 × 32列 × 3通道(rgb)
img_arr = np.random.randint(0, 255, (2, 32, 32, 3))
print("原始4维数组形状:", img_arr.shape) # (2, 32, 32, 3)
# 按行优先展平(默认)
img_flat_c = img_arr.flatten(order='c')
print("c风格展平形状:", img_flat_c.shape) # (6144,) → 2×32×32×3=6144
# 按列优先展平
img_flat_f = img_arr.flatten(order='f')
print("f风格展平形状:", img_flat_f.shape) # (6144,)七、避坑点与常见问题
1. 常见误区
- ❌ 认为 flatten() 是 numpy 函数:它是数组对象的方法,不能直接用 np.flatten(arr),必须用 arr.flatten();
- ❌ 混淆 flatten() 和 ravel():ravel() 是 numpy 函数,效果接近 reshape(-1)(返回视图,共享内存),而 flatten() 返回拷贝;
- ❌ 展平后修改原数组:若用 flatten(),修改展平数组不会影响原数组,反之亦然。
2. 报错场景
对非 numpy 数组使用 flatten():python 列表没有 flatten() 方法,需先转为 ndarray:
# 错误:list.flatten() # lst = [[1,2],[3,4]] # lst.flatten() → attributeerror # 正确:先转numpy数组 lst = [[1,2],[3,4]] arr = np.array(lst) arr.flatten() # [1 2 3 4]
总结
- flatten() 核心是将任意维度数组展平为一维,返回独立拷贝,修改后不影响原数组;
- 关键参数 order:'c'(行优先,默认)、'f'(列优先)控制展平顺序;
- 与 reshape(-1) 核心区别:flatten() 是拷贝(独立),reshape(-1) 是视图(共享内存);
- 选型原则:
- 需独立数据 → 用 flatten();
- 追求效率 / 临时展平 → 用 reshape(-1);
- 避坑关键:仅对 numpy 数组使用 flatten(),python 列表需先转 ndarray。
到此这篇关于numpy中flatten()函数的具体使用的文章就介绍到这了,更多相关numpy flatten()函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论