返回

NumPy flatten() 与 ravel() 有啥区别?深入解析展开与扁平化

python

揭秘 NumPy 展平和扁平化:flatten() 与 ravel() 的区别

引言

在 NumPy 的工具箱中,flatten() 和 ravel() 两个函数经常让开发者迷惑,因为它们看似都在执行同样的任务:将多维数组 "扁平化" 为一维数组。然而,它们在看似相似的外表下,却隐藏着细微但关键的区别,理解这些区别对于有效利用它们至关重要。

展开与扁平化:概念上的差异

展开 ,顾名思义,就是将多维数组 "展开" 成一个连续的一维数组。它遵循数组的内存布局,按行或按列逐个元素地展开数组。

扁平化 则是一个更具破坏性的操作。它创建一个全新的数组,其中原始数组的所有元素都按特定顺序排列。

何时使用 flatten()

flatten() 通常用于需要将多维数组转换为单列向量的情况。例如,如果你有一个图像数组,需要将其转换为一维数组以便进行机器学习处理,flatten() 是一个理想的选择。它可以轻松地将图像的所有像素值排列成一个向量,而不会改变原始数组的形状或维度。

何时使用 ravel()

ravel() 与 flatten() 类似,但它提供了一个可选的 order 参数,允许你指定展开的顺序。order 参数可以是 "C"(按行展开)或 "F"(按列展开)。此功能对于在特定应用程序中需要特定顺序展开数组的情况很有用。例如,如果你有一个需要按列展开的矩阵以进行特定的数学运算,ravel() 将非常有用。

示例说明

为了进一步阐明这两个函数之间的差异,让我们考虑一个示例:

import numpy as np

# 创建一个多维数组
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 使用 flatten() 展平数组
flattened_arr = arr.flatten()

# 使用 ravel() 按行展开数组
raveled_arr_row = arr.ravel(order="C")

# 使用 ravel() 按列展开数组
raveled_arr_col = arr.ravel(order="F")

输出:

原始数组:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]

使用 flatten() 展平的数组:
 [1 2 3 4 5 6 7 8 9]

使用 ravel() 按行展开的数组:
 [1 2 3 4 5 6 7 8 9]

使用 ravel() 按列展开的数组:
 [1 4 7 2 5 8 3 6 9]

从输出中可以看到,flatten() 和 ravel(order="C") 都将数组展开为一维行向量。然而,ravel(order="F") 将数组展开为一维列向量。

选择合适的函数

选择 flatten() 或 ravel() 取决于你对输出数组的特定需求。如果需要将多维数组转换为单列向量,而不需要指定展开顺序,flatten() 是一个不错的选择。另一方面,如果你需要控制展开顺序,ravel() 的 order 参数将非常有用。

结论

flatten() 和 ravel() 虽然看似执行相同的功能,但它们在细微之处却有着不同的作用。了解这两个函数之间的差异对于有效地使用它们来满足你的特定数组处理需求至关重要。无论你是需要按行展开还是按列展开,还是需要将多维数组转换为一维行向量,NumPy 的 flatten() 和 ravel() 都能满足你的需求。

常见问题解答

Q1:flatten() 和 ravel() 有什么区别?

A1: flatten() 将多维数组转换为一维行向量,而 ravel() 提供了控制展开顺序(按行或按列)的选项。

Q2:什么时候应该使用 flatten()?

A2: 当需要将多维数组转换为单列向量时,而不需要指定展开顺序。

Q3:什么时候应该使用 ravel()?

A3: 当需要控制展开顺序时,例如按行或按列。

Q4:ravel() 中 order 参数的作用是什么?

A4: order 参数允许你指定展开顺序,可以是 "C"(按行)或 "F"(按列)。

Q5:flatten() 和 ravel() 会改变原始数组吗?

A5: 不会,这两个函数都会创建原始数组的新副本。