NumPy - 数组迭代
NumPy 中的数组迭代
NumPy 中的数组迭代是指以系统的方式逐个访问数组中每个元素的过程。这通常使用循环来完成。迭代用于对每个元素执行操作,例如计算、修改或检查。
NumPy 提供了几种迭代数组的方法 -
- 使用 for 循环
- 使用 'nditer()' 迭代器对象
- 平面迭代
- 迭代顺序
- 控制迭代顺序
- 广播迭代
- 使用向量化操作
- 外部循环
- 修改数组值
使用 for 循环
在 NumPy 中,您可以使用基本的 Python for 循环 来迭代数组。 for 循环是一种用于迭代序列(例如列表、元组、字典、集合或字符串)的控制流语句。它允许您对序列中的每个元素重复执行一段代码。
迭代一维数组
一维数组本质上是一个元素列表。对其进行迭代很简单,类似于对常规 Python 列表进行迭代。
示例
在下面的示例中,我们根据元素列表创建一个 NumPy 数组,并使用 for 循环对每个元素进行迭代 -
import numpy as np # 创建一个一维 NumPy 数组 arr = np.array([1, 2, 3, 4, 5]) # 迭代数组 for element in arr: print(element)
以下是得到的输出 -
1 2 3 4 5
迭代多维数组
NumPy 数组可以有任意数量的维度,通常称为轴。例如 -
- 一维数组是元素的列表。
- 二维数组就像一个有行和列的矩阵。
- 三维数组可以可视化为二维矩阵的集合。
示例:迭代二维数组
迭代二维数组时,每次迭代都会访问数组的一整行,如下例所示 -
import numpy as np # 创建二维 NumPy 数组(3x3 矩阵) arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 迭代数组 for row in arr_2d: print(row)
这将产生以下结果 -
[1 2 3] [4 5 6] [7 8 9]
示例:迭代三维数组
迭代三维数组时,每次迭代都会访问一个完整的二维子数组(矩阵),如下例所示 -
import numpy as np # 创建一个三维 NumPy 数组 (2x2x3) arr_3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) # 迭代数组 for matrix in arr_3d: print(matrix)
以下是上述代码的输出 -
[[1 2 3] [4 5 6]] [[ 7 8 9] [10 11 12]]
迭代多维数组中的元素
在 NumPy 中,迭代多维数组中的元素是一种访问每个单独元素的方法,无论数组的维度是多少。此过程需要嵌套循环来遍历数组结构的每个维度。
示例
在此示例中,我们使用嵌套循环遍历每一行 (i) 和列 (j),以使用索引访问和打印每个元素 -
import numpy as np # 创建一个二维 NumPy 数组 arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 迭代二维数组中的元素 # 迭代行 for i in range(arr_2d.shape[0]): # 迭代列 for j in range(arr_2d.shape[1]): print(arr_2d[i, j])
输出结果如下 -
1 2 3 4 5 6 7 8 9
使用索引进行迭代
使用索引对 NumPy 数组进行迭代,用于根据数组元素在数组每个维度中的特定位置进行访问。
在 NumPy 中,数组的每个维度都从 0 开始索引。使用索引进行迭代需要使用嵌套循环遍历数组的每个维度,并使用其特定索引访问元素。
与简单的元素迭代相比,这种方法可以更精确地控制元素的访问和操作。
示例
在下面的示例中,我们使用嵌套循环对二维数组的每个元素进行迭代。我们访问并打印每个元素的值及其索引 -
import numpy as np # 创建一个二维 NumPy 数组 arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 获取数组的维度 rows, cols = arr_2d.shape # 使用索引遍历数组 for i in range(rows): for j in range(cols): print(f"元素位于 ({i}, {j}): {arr_2d[i, j]}")
执行上述代码后,我们得到以下输出 -
元素位于 (0, 0):1 元素位于 (0, 1):2 元素位于 (0, 2):3 元素位于 (1, 0):4 元素位于 (1, 1):5 元素位于 (1, 2):6 元素位于 (2, 0):7 元素位于 (2, 1):8 元素位于 (2, 2):9
使用 'nditer' 迭代器对象
NumPy 中的 nditer() 函数提供了一个高效的多维迭代器对象,可用于迭代数组的元素。它使用 Python 的标准迭代器接口来访问数组中的每个元素。
示例
在此示例中,nditer() 函数用于按扁平顺序迭代数组"arr"的所有元素,并按顺序打印每个元素 -
import numpy as np # 数组示例 arr = np.array([[1, 2], [3, 4]]) # 使用 nditer 进行迭代 for x in np.nditer(arr): print(x)
结果如下:-
1234
平面迭代
平面迭代是指将多维数组的所有元素像一维数组一样进行迭代。当您需要处理或操作数组中的每个元素,而无需明确考虑其原始形状或尺寸时,这种方法非常有用。
示例
在此示例中,我们创建一个二维 NumPy 数组。然后,我们使用带有"buffered"标志的 np.nditer 函数,以扁平化序列的形式迭代该数组,并按顺序打印每个元素 -
import numpy as np # 创建二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 使用带有"buffered"标志的 nditer 进行平面迭代 print("迭代数组:") for x in np.nditer(arr, flags=['buffered']): print(x, end=' ')
我们得到如下所示的输出 -
迭代数组: 1 2 3 4 5 6
迭代顺序
NumPy 中的迭代顺序是指在迭代过程中访问数组元素的顺序。默认情况下,NumPy 数组以行优先顺序进行迭代,也称为C 风格顺序。
这意味着对于多维数组,迭代从第一维(行)开始,沿最后一维(列)迭代所有元素。
示例
在此示例中,我们使用 numpy.nditer() 函数迭代数组,以默认的行优先顺序(C 风格)访问每个元素,并按顺序打印它们 -
import numpy as np # 创建二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 迭代数组 print("默认迭代顺序 (C 风格,行优先):") for x in np.nditer(arr): print(x, end=' ')
以下是得到的输出 −
默认迭代顺序 (C 风格,行优先): 1 2 3 4 5 6
控制迭代顺序
在 NumPy 中控制迭代顺序允许您指定在迭代期间访问数组元素的方式。 NumPy 提供了基于内存布局和性能考虑来控制迭代顺序的选项 -
Fortran 风格顺序 - 按列(列优先顺序)迭代元素。
for x in np.nditer(arr, order='F'): ...
外部循环 - 在迭代外部维度时保持内部维度不变。
for row in np.nditer(arr, flags=['external_loop']): ...
示例
在此示例中,我们使用numpy.nditer() 函数,以 Fortran 风格顺序(F 风格)访问每个元素 −
import numpy as np # 数组 arr = np.array([[1, 2], [3, 4]]) # 按指定顺序迭代(F 风格) for x in np.nditer(arr, order='F'): print(x)
这将产生以下结果 -
1 3 2 4
广播迭代
NumPy 中的广播迭代是指同时迭代多个数组,其中数组被广播以具有兼容的形状。
这使得元素级操作可以高效地应用于数组,而无需明确对齐它们的维度。
示例
在下面的示例中,我们通过迭代两个数组 arr1 和 arr2 来演示 NumPy 中的广播迭代。同时执行。
使用 nditer() 函数对"arr1"和"arr2"中的每一对对应元素进行求和,展示了无需明确对齐数组维度的逐元素运算 -
import numpy as np # 数组 arr1 = np.array([1, 2, 3]) arr2 = np.array([10, 20, 30]) # 广播加法运算 print("广播迭代:") for x, y in np.nditer([arr1, arr2]): print(x + y, end=' ')
以下是上述代码的输出 -
广播迭代: 11 22 33
使用向量化运算
NumPy 中的向量化运算是指一次性对整个数组执行运算,而不是对单个元素进行迭代。
示例
在下面的示例中,我们通过对两个数组 arr1 和 arr2 执行逐元素加法来演示 NumPy 中的向量化运算。只需在数组之间使用 + 运算符即可实现 -
import numpy as np # 数组示例 arr1 = np.array([1, 2, 3, 4]) arr2 = np.array([10, 20, 30, 40]) # 向量化加法运算 result = arr1 + arr2 print("向量化运算:") print("加法结果:", result)
输出结果如下所示 -
向量化运算:加法结果:[11 22 33 44]
外部循环
在 NumPy 中,外部循环的概念loop 指的是在保持特定维度不变的情况下迭代数组。这允许你迭代具有嵌套结构的数组,而不会将内部维度折叠成单个序列。
numpy.nditer() 函数与 external_loop 标志一起使用时,允许在保留数组行结构的情况下迭代数组元素。这确保了每一行都被单独处理,并展示了如何在整个迭代过程中保持维度的完整性。
示例
在下面的示例中,我们通过迭代二维数组来演示 NumPy 中的外部循环迭代 -
import numpy as np # 多维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 外部循环迭代 print("外部循环:") for row in np.nditer(arr, flags=['external_loop']): print(row)
执行上述代码后,我们得到以下输出 -
外部循环:[1 2 3 4 5 6]
修改数组值
在 NumPy 中,修改数组值是指直接将新值赋给数组中的特定元素或切片。这有助于在无需重新创建整个数组的情况下就地更新数据。
nditer 对象还有另一个可选参数,称为 op_flags。其默认值为只读,但可以设置为读写或只写模式。这将允许使用此迭代器修改数组元素。
示例
在下面的示例中,我们使用 nditer() 函数修改 NumPy 中的数组值。通过将"op_flags"参数设置为"readwrite",迭代器会将数组 arr 的每个元素乘以 2 -
import numpy as np # 创建一维数组 arr = np.array([1, 2, 3, 4, 5]) # 修改数组元素 with np.nditer(arr, flags=['buffered'], op_flags=['readwrite']) as it: for x in it: # 将每个元素乘以 2 x[...] = x * 2 print("修改后的数组示例:",arr)
生成的结果如下 -
修改后的数组示例:[ 2 4 6 8 10]