NumPy 数组迭代
迭代数组
迭代意味着逐个遍历元素。
由于我们在 numpy 中处理多维数组,因此可以使用 python 的基本 for
循环来完成此操作。
如果我们在一维数组上进行迭代,它将逐个遍历每个元素。
实例
迭代以下一维数组的元素:
import numpy as np arr = np.array([1, 2, 3]) for x in arr: print(x)
迭代二维数组
在二维数组中,它将遍历所有行。
实例
迭代以下二维数组的元素:
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) for x in arr: print(x)
如果我们迭代一个 n 维数组,它将一一遍历 n-1 维。
要返回实际值(即标量),我们必须在每个维度中迭代数组。
实例
迭代二维数组的每个标量元素:
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) for x in arr: for y in x: print(y)
迭代三维数组
在三维数组中,它将遍历所有二维数组。
实例
迭代以下三维数组的元素:
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 arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) for x in arr: for y in x: for z in y: print(z)
使用 nditer() 迭代数组
函数 nditer()
是一个帮助函数,可以用于从非常基本的迭代到非常高级的迭代。它解决了我们在迭代中遇到的一些基本问题,让我们通过示例来了解一下。
迭代每个标量元素
在基本的 for
循环中,我们需要使用 n 个 for
循环来遍历数组的每个标量,这对于具有非常高维数的数组来说可能很难编写。
实例
迭代以下三维数组:
import numpy as np arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) for x in np.nditer(arr): print(x)
迭代具有不同数据类型的数组
我们可以使用 op_dtypes
参数并将其传递给期望的数据类型,以在迭代时更改元素的数据类型。
NumPy 不会就地更改元素的数据类型(元素在数组中的位置),因此它需要一些额外的空间来执行此操作,该额外空间称为缓冲区,为了在 nditer()
中启用它,我们传递 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)
以不同的步长进行迭代
我们可以使用过滤,然后进行迭代。
实例
在跳过 1 个元素的情况下,遍历二维数组的每个标量元素:
import numpy as np arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) for x in np.nditer(arr[:, ::2]): print(x)
使用 ndenumerate() 进行枚举迭代
枚举就是一一列举某事物的序号。
有时我们在迭代时需要元素的相应索引,ndenumerate()
方法可用于这些用例。
实例
枚举以下一维数组元素:
import numpy as np arr = np.array([1, 2, 3]) for idx, x in np.ndenumerate(arr): print(idx, x)
实例
枚举以下二维数组的元素:
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)