Python NumPy Array(数组) 迭代 遍历

NumPy(Numerical Python 的缩写)是一个开源的 Python 科学计算库。通过 NumPy,可以高效地处理 多维数组(ndarray),并提供大量用于 线性代数、傅里叶变换和随机数生成 的函数。在使用 NumPy 处理数组时,经常需要 遍历(迭代)数组中的元素。本文主要介绍 NumPy 数组的多种迭代方式,包括普通 for 循环、nditer() 和 ndenumerate()。

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 循环,就不要用循环

优先顺序建议:

  1. 向量化运算(推荐)

  2. NumPy 内置函数

  3. nditer() / ndenumerate()

  4. 多层 for 循环(不推荐)

推荐阅读
cjavapy编程之路首页