一般迭代
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