NumPy中flatten()函数的具体使用

 更新时间:2026年04月17日 10:06:19   作者:林深时见鹿1  
本文主要介绍了NumPy中flatten()函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、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]

总结

  1. flatten() 核心是将任意维度数组展平为一维,返回独立拷贝,修改后不影响原数组;
  2. 关键参数 order:'C'(行优先,默认)、'F'(列优先)控制展平顺序;
  3. 与 reshape(-1) 核心区别:flatten() 是拷贝(独立),reshape(-1) 是视图(共享内存);
  4. 选型原则:
    • 需独立数据 → 用 flatten();
    • 追求效率 / 临时展平 → 用 reshape(-1);
  5. 避坑关键:仅对 NumPy 数组使用 flatten(),Python 列表需先转 ndarray。

到此这篇关于NumPy中flatten()函数的具体使用的文章就介绍到这了,更多相关NumPy flatten()函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python3.9.1环境安装的方法(图文)

    python3.9.1环境安装的方法(图文)

    这篇文章主要介绍了python3.9.1环境安装的方法(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 详解python代码模块化

    详解python代码模块化

    今天给大家带来的是关于Python的相关知识,文章围绕着python代码模块化展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • python绘制春节烟花的示例代码

    python绘制春节烟花的示例代码

    这篇文章主要介绍了使用python 实现的简单春节烟花效果的示例代码,请注意,运行本文的代码之前,请确保计算机上已经安装了Pygame库,需要的朋友可以参考下
    2024-02-02
  • request基本使用及各种请求方式参数的示例

    request基本使用及各种请求方式参数的示例

    这篇文章主要为大家介绍了request的基本使用及各种请求方式参数示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 利用python实现终身免费的听书工具

    利用python实现终身免费的听书工具

    本文通过实际案例,详细介绍了作者如何利用Python库实现文本转语音的过程,从安装库到实际操作案例,都有详细的说明,为读者提供了一定的参考价值
    2024-03-03
  • Python实现爬取并分析电商评论

    Python实现爬取并分析电商评论

    这篇文章主要介绍了Python实现爬取并分析电商评论,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python实现微信机器人的方法

    Python实现微信机器人的方法

    这篇文章主要介绍了Python实现微信机器人的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • python中私有函数调用方法解密

    python中私有函数调用方法解密

    这篇文章主要介绍了python中私有函数调用方法,较为详细的分析了Python私有函数的原理与调用技巧,需要的朋友可以参考下
    2016-04-04
  • Python实现Gif图片分解的示例代码

    Python实现Gif图片分解的示例代码

    这篇文章主要为大家详细介绍了如何利用Python语言实现Gif图片分解功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手尝试一下
    2022-08-08
  • 提高 Python 开发效率的3个小工具

    提高 Python 开发效率的3个小工具

    这篇文章主要给大家分享得事提高 Python 开发效率的3个小工具,它们能够帮助我们提高工作效率。本文将介绍笔者在近一周发现的三个小工具,写文章以做记录,希望能对大家有所帮助
    2022-01-01

最新评论