一般迭代
NumPy包包含一个迭代器对象numpy.nditer。 它是一个有效的多维迭代器对象,可以用于在数组上进行迭代。 数组的每个元素可使用 Python的标准Iterator接口来访问。
使用arange()函数创建一个 3X4 数组,并使用nditer对它进行迭代。
示例 1
>>> a = np.arange(0, 60, 5)
>>> a.shape = 3, 4
array([[ 0, 5, 10, 15],[20, 25, 30, 35],[40, 45, 50, 55]])
>>> for x in np.nditer(a):
... print(x)
...
...
0
5
10
15
20
25
30
35
40
45
50
55
>>> 示例 2
迭代的顺序匹配数组的内容布局,而不考虑特定的排序。 这可以通过迭代上述数组的转置来看到。
>>> import numpy as np
>>> a = np.arange(0, 60, 5)
>>> a.shape = 3, 4
>>> a
array([[ 0, 5, 10, 15],[20, 25, 30, 35],[40, 45, 50, 55]])
>>> b = a.T
>>> b
array([[ 0, 20, 40],[ 5, 25, 45],[10, 30, 50],[15, 35, 55]])
>>> for x in np.nditer(b):
... print(x)
...
...
0
5
10
15
20
25
30
35
40
45
50
55
迭代顺序
如果相同元素使用F风格顺序存储,则迭代器选择以更有效的方式对数组进行迭代。
示例 1
>>> c = b.copy(order='F')
>>> for x in np.nditer(c):
... print(x)
...
...
0
5
10
15
20
25
30
35
40
45
50
55
>>> 示例 2
可以通过显式提醒,来强制nditer对象使用某种顺序:
>>> for x in np.nditer(a, order='C'):
... print(x)
...
...
0
5
10
15
20
25
30
35
40
45
50
55
>>> for x in np.nditer(a, order='F'):
... print(x)
...
...
0
20
40
5
25
45
10
30
50
15
35
55
>>>
修改数组的值
nditer对象有另一个可选参数op_flags。 其默认值为只读,但可以设置为读写或只写模式。 这将允许使用此迭代器修改数组元素。
示例
>>> for x in np.nditer(a, op_flags=['readwrite']):
... x[...]=2*x
...
...
>>> a
array([[ 0, 10, 20, 30],[ 40, 50, 60, 70],[ 80, 90, 100, 110]])
>>> 外部循环
nditer类的构造器拥有flags参数,它可以接受下列值:
| 序号 | 参数及描述 |
|---|---|
| 1. | c_index 可以跟踪C顺序的索引 |
| 2. | f_index 可以跟踪Fortran顺序的索引 |
| 3. | multi-index 每次迭代可以跟踪一种索引类型 |
| 4. | external_loop 给出的值是具有多个值的一维数组,而不是零维数组 |
示例
在下面的示例中,迭代器遍历对应于每列的一维数组。
>>> for x in np.nditer(a, flags=['external_loop'], order='F'):
... print(x)
...
...
[ 0 40 80]
[10 50 90]
[ 20 60 100]
[ 30 70 110] 广播迭代
如果两个数组是可广播的,nditer组合对象能够同时迭代它们。 假设数组a具有维度 3X4,并且存在维度为 1X4 的另一个数组b,则使用以下类型的迭代器(数组b被广播到a的大小)。
示例
>>> a = np.arange(0, 60, 5)
>>> a.shape = 3, 4
>>> b = np.arange(1, 5)
>>> a
array([[ 0, 5, 10, 15],[20, 25, 30, 35],[40, 45, 50, 55]])
>>> b
array([1, 2, 3, 4])
>>> for x,y in np.nditer([a, b]):
... print(x, ':', y)
...
...
0 : 1
5 : 2
10 : 3
15 : 4
20 : 1
25 : 2
30 : 3
35 : 4
40 : 1
45 : 2
50 : 3
55 : 4