📜  Flatten() 和 Ravel() Numpy 函数之间的差异(1)

📅  最后修改于: 2023-12-03 15:00:46.932000             🧑  作者: Mango

Flatten() 和 Ravel() Numpy 函数之间的差异

在 Numpy 中,有两个函数用于将多维数组转换为一维数组:flatten()ravel()。这两个函数之间有一些重要的差异,我们需要了解这些差异以便在编写代码时正确使用它们。

Flatten() 函数

flatten() 函数返回一个将多维数组展开为一维数组的副本。它将多维数组的所有元素复制到一维数组中,并将其返回。它不会影响原始数组。

以下是使用 Flatten() 函数的示例代码:

import numpy as np

arr = np.array([[1,2,3],[4,5,6]])
out_arr = arr.flatten()

print("Original array shape:", arr.shape)
print("Flattened array shape:", out_arr.shape)

输出结果如下:

Original array shape: (2, 3)
Flattened array shape: (6,)

从输出结果可以看出,原始数组是一个 2x3 的矩阵,而展开后的数组是一个具有 6 个元素的一维数组。

Ravel() 函数

ravel() 函数也返回将多维数组展开为一维数组的副本。但与 flatten() 不同的是,它返回的是原始数组的视图,而不是复制。

以下是使用 ravel() 函数的示例代码:

import numpy as np

arr = np.array([[1,2,3],[4,5,6]])
out_arr = arr.ravel()

print("Original array shape:", arr.shape)
print("Flattened array shape:", out_arr.shape)

输出结果如下:

Original array shape: (2, 3)
Flattened array shape: (6,)

可以将 ravel() 函数的输出结果与 flatten() 函数的输出结果进行比较,它们是相同的。但请注意,使用 ravel() 函数时,如果修改了返回的一维数组中的元素,则原始数组也会发生相应的更改。

以下是一个示例代码,它演示了修改 ravel() 函数返回的一维数组中的元素时原始数组是如何修改的:

import numpy as np

arr = np.array([[1,2,3],[4,5,6]])
out_arr = arr.ravel()

print("Original array:")
print(arr)

out_arr[0] = 100

print("Modified array:")
print(arr)

输出结果如下:

Original array:
[[1 2 3]
 [4 5 6]]
Modified array:
[[100   2   3]
 [  4   5   6]]

可以看出,将 out_arr[0] 的值设置为 100 后,原始数组中的相应元素也发生了更改。

需要注意的是,如果使用 ravel() 函数返回的一维数组修改了原始数组中的元素,那么这些更改也会反映在使用原始数组时返回的数组中。这可能会导致意外的行为,因此在使用 ravel() 函数时应谨慎操作。

总结

两个函数中,ravel() 函数更适合对大型数组进行操作,因为它返回的是原始数组的视图,而不是复制。如果不打算修改数组元素,则可使用 flatten() 函数,因为它始终返回一份复制。无论你使用哪个函数,都需要了解它们各自的差异,以便根据实际情况选择最佳函数。