章节
NumPy提供了迭代器对象NumPy.nditer
,是一个高效的多维迭代器对象,可以使用它对数组进行迭代,使用Python的标准迭代器接口访问数组元素。
示例
import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
print("打印数组:")
print(a);
print("
")
print("数组迭代:")
for x in np.nditer(a):
print(x, end=' ')
print("
")
输出
打印数组:
[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]]
数组迭代:
1 2 3 4 2 4 5 6 10 20 39 3
我们知道,numpy中的数组排序有两种:
- F(Fortran)风格顺序,列排序
- C(C语言)风格顺序,行排序
默认情况下,迭代顺序通常受数组的内存布局影响,不受特定的数组排序(C风格顺序/F风格顺序)影响。
可以看一下把上面示例中的数组转置后,对其进行迭代时的顺序。
示例
比较数组及其转置数组的迭代顺序:
import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
print("打印数组:")
print(a)
print("
")
print("打印数组的转置:")
at = a.T
print(at)
print("
数组迭代:")
for x in np.nditer(a):
print(x, end=' ')
print("
")
print("
转置的数组迭代:")
for x in np.nditer(at):
print(x, end=' ')
print("
")
输出
打印数组:
[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]]
打印数组的转置:
[[ 1 2 10]
[ 2 4 20]
[ 3 5 39]
[ 4 6 3]]
数组迭代:
1 2 3 4 2 4 5 6 10 20 39 3
转置的数组迭代:
1 2 3 4 2 4 5 6 10 20 39 3
可以看到,这两个迭代顺序是一样的,转置没有影响迭代顺序。
迭代顺序
要强制按F排序或C排序的顺序迭代数组,可在创建迭代对象时显式指定。
示例
import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
print("
打印数组:
")
print(a)
print("
打印数组的转置:
")
at = a.T
print(at)
print("
迭代转置后的数组
")
for x in np.nditer(at):
print(x, end= ' ')
print("
按C风格顺序迭代数组:
")
for x in np.nditer(at, order = 'C'):
print(x,end=' ')
输出
打印数组:
[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]]
打印数组的转置:
[[ 1 2 10]
[ 2 4 20]
[ 3 5 39]
[ 4 6 3]]
迭代转置后的数组
1 2 3 4 2 4 5 6 10 20 39 3
按C风格顺序迭代数组:
1 2 10 2 4 20 3 5 39 4 6 3
数组修改
迭代数组时,默认数组值不能修改,因为迭代对象的op-flag
默认被设置为只读。如要可修改,可在创建迭代对象时,把op_flags
设置为readwrite
或write
。
示例
import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
print("
打印原始数组:
")
print(a)
print("
遍历修改后的数组:
")
for x in np.nditer(a, op_flags = ['readwrite']):
x[...] = 3 * x;
print(x,end = ' ')
输出
打印原始数组:
[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]]
遍历修改后的数组:
3 6 9 12 6 12 15 18 30 60 117 9
广播迭代
如果两个数组是可广播的,可以使用组合的nditer对象对它们进行并发迭代。假设一个数组a的维数为3X4,而另一个数组b的维数为1X4,可使用以下类型的迭代器(将数组b广播到a的大小)。
示例
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print ('数组a:')
print (a)
print ('
')
print ('数组b:')
b = np.array([1, 2, 3, 4], dtype = int)
print (b)
print ('
')
print ('同时迭代2个可广播的数组:')
for x,y in np.nditer([a,b]):
print ("%d:%d" % (x,y))
输出
数组a:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
数组b:
[1 2 3 4]
同时迭代2个可广播的数组:
0:1
5:2
10:3
15:4
20:1
25:2
30:3
35:4
40:1
45:2
50:3
55:4