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’) 的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的,默认是按行访问。

posted @ 2021-12-04 16:02  KYZH  阅读(228)  评论(0编辑  收藏  举报