np.nditer()
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite']) while not it.finished: # ... it.iternext()
np.nditer:有效的多维迭代器对象,可以遍历数组。
参数(部分):
op:ndarray或array_like的序列。迭代的数组。
flags:“multi_index”导致跟踪多个索引或每个迭代维度一个索引元组。
op_flags :
“readonly”表示只读取操作数。
“readwrite”表示将读取和写入操作数。
“writeonly”表示只会写入操作数。
实例一:
单维迭代
import numpy as np x = np.arange(6).reshape(2,3) it = np.nditer(x, flags=['f_index']) # print(*it) # 0 1 2 3 4 5 while not it.finished: print("%d<%s>"%(it[0],it.index)) it.iternext()
输出结果为:
0<0> 1<2> 2<4> 3<1> 4<3> 5<5>
注:it.iternext()表示进入下一次迭代,如果不加这一句的话,输出的结果就一直都是0 <(0, 0)>且不间断地输出
多维迭代
import numpy as np x = np.arange(6).reshape(2,3) it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite']) # print(*it) # 0 1 2 3 4 5 while not it.finished: print("%d<%s>"%(it[0],it.multi_index)) it.iternext()
输出结果为:
0<(0, 0)> 1<(0, 1)> 2<(0, 2)> 3<(1, 0)> 4<(1, 1)> 5<(1, 2)>
实例二:控制遍历顺序
列顺序迭代
import numpy as np x = np.arange(6).reshape(2,3) it = np.nditer(x,flags=["f_index"],order = "F") while not it.finished: print("%d <%s>" % (it[0], it.index), end='*') it.iternext()
输出结果为:
0 <0>*3 <1>*1 <2>*4 <3>*2 <4>*5 <5>*
行顺序迭代
import numpy as np x = np.arange(6).reshape(2,3) it = np.nditer(x,flags=["f_index"],order = "C") while not it.finished: print("%d <%s>" % (it[0], it.index), end='*') it.iternext()
输出结果为:
0 <0>*1 <2>*2 <4>*3 <1>*4 <3>*5 <5>*
以上实例不是使用标准 C 或者 Fortran 顺序,选择的顺序是和数组内存布局一致的,这样做是为了提升访问的效率,默认是行序优先(row-major order,或者说是 C-order)
import numpy as np a = np.arange(6).reshape(2,3) for x in np.nditer(a.T): print (x, end=", " ) print ('\n') # 0, 1, 2, 3, 4, 5, for x in np.nditer(a.T.copy(order='C')): print (x, end=", " ) print ('\n') # 0, 3, 1, 4, 2, 5,
从上述例子可以看出,a 和 a.T 的遍历顺序是一样的,也就是他们在内存中的存储顺序也是一样的,但是 a.T.copy(order = ‘C’) 的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的,默认是按行访问。