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("\n") print("数组迭代:") for x in np.nditer(a): print(x, end=' ') print("\n")
输出
打印数组: [[ 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("\n") print("打印数组的转置:") at = a.T print(at) print("\n数组迭代:") for x in np.nditer(a): print(x, end=' ') print("\n") print("\n转置的数组迭代:") for x in np.nditer(at): print(x, end=' ') print("\n")
输出
打印数组: [[ 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("\n打印数组:\n") print(a) print("\n打印数组的转置:\n") at = a.T print(at) print("\n迭代转置后的数组\n") for x in np.nditer(at): print(x, end= ' ') print("\n按C风格顺序迭代数组:\n") 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("\n打印原始数组:\n") print(a) print("\n遍历修改后的数组:\n") 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 ('\n') print ('数组b:') b = np.array([1, 2, 3, 4], dtype = int) print (b) print ('\n') 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
本文来自博客园,作者:大码王,转载请注明原文链接:https://www.cnblogs.com/huanghanyu/