1、迭代遍历一维数组
在 NumPy 中,一维数组的迭代方式与 Python 列表非常相似。
示例:遍历一维数组的每个元素
import numpy as np
arr = np.array([1, 2, 3])
for x in arr:
print(x)说明:
每次循环得到的是一个 标量值
是最简单、最直观的遍历方式
2、迭代遍历二维数组
当对二维数组进行迭代时,默认遍历的是第一维(行)。
示例:遍历二维数组(按行)
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6]])
for x in arr:
print(x)输出结果:
[1 2 3] [4 5 6]
说明:
每次循环得到的是 一行数组(一维 ndarray)
而不是单个数值
遍历二维数组中的每个标量元素
如果需要访问 每一个具体的数值(标量),就需要进行嵌套循环。
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6]])
for x in arr:
for y in x:
print(y)3、迭代遍历三维数组
对于三维数组:
第一层循环遍历的是 二维数组
第二层遍历的是 一维数组
第三层才能访问到 标量元素
示例:遍历三维数组(按 2-D 数组)
import numpy as np
arr = np.array([
[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]
])
for x in arr:
print(x)遍历三维数组中的所有标量值
import numpy as np
for x in arr:
for y in x:
for z in y:
print(z)⚠️ 对于高维数组,这种嵌套 for 循环 可读性和可维护性都很差。
4、使用 nditer() 迭代数组(推荐)
nditer() 是 NumPy 提供的 通用迭代器,可以:
以统一方式遍历任意维度数组
直接返回 标量元素
避免多层嵌套循环
示例:使用 nditer() 遍历 3-D 数组
import numpy as np
arr = np.array([[[1, 2], [3, 4]],
[[5, 6], [7, 8]]])
for x in np.nditer(arr):
print(x)说明:
不论数组是几维
nditer()都会 逐个返回标量值
5、在迭代时使用不同的数据类型
在迭代过程中,可以通过 op_dtypes 参数 临时指定输出数据类型。
⚠️ NumPy 不会就地修改原数组的数据类型
因此需要:
使用缓冲区
启用
flags=['buffered']
示例:以字符串形式遍历数组
import numpy as np
arr = np.array([1, 2, 3])
for x in np.nditer(arr, flags=['buffered'], op_dtypes=['S']):
print(x)说明:
原数组仍然是整数类型
迭代时得到的是 字节字符串
6、使用不同步长进行遍历
可以结合 切片 与 nditer(),实现按步长遍历。
示例:遍历二维数组,跳过部分元素
import numpy as np
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8]])
for x in np.nditer(arr[:, ::2]):
print(x)输出:
1 3 5 7
说明:
::2表示步长为 2先切片,再迭代
7、使用 ndenumerate() 进行枚举迭代
有些场景下,不仅需要元素值,还需要元素索引。
这时可以使用 ndenumerate()。
示例:遍历一维数组(带索引)
import numpy as np
arr = np.array([1, 2, 3])
for idx, x in np.ndenumerate(arr):
print(idx, x)输出:
(0,) 1 (1,) 2 (2,) 3
示例:遍历二维数组(带索引)
import numpy as np
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8]])
for idx, x in np.ndenumerate(arr):
print(idx, x)输出示例:
(0, 0) 1 (0, 1) 2 (0, 2) 3 (0, 3) 4 (1, 0) 5 ...
说明:
idx是一个元组元组中的每个值表示对应维度的索引
8、关于性能的一个重要提醒 ⚠️
在 NumPy 中:
能不用 Python 循环,就不要用循环
优先顺序建议:
向量化运算(推荐)
NumPy 内置函数
nditer()/ndenumerate()多层
for循环(不推荐)