NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。

遍历顺序是和数组内存布局一致的,默认是行序优先(row-major order,或者说是 C-order)。

  • for x in np.nditer(a, order='F'):Fortran order,即是列序优先;
  • for x in np.nditer(a.T, order='C'):C order,即是行序优先;

可以通过显式设置,来强制 nditer 对象使用某种顺序:

复制代码
  1. import numpy as np
  2.  
  3. a = np.arange(0, 60, 5)
  4. a = a.reshape(3, 4)
  5. print ('原始数组是:')
  6. print (a)
  7. print ('\n')
  8. print ('按行遍历')
  9. for x in np.nditer(a, order='C'):
  10. print (x,end=',')
  11. print ('\n')
  12. print ('按列遍历')
  13. for x in np.nditer(a, order='F'):
  14. print (x,end=',')
  15. print ('\n')

修改数组中元素的值

nditer 对象有另一个可选参数 op_flags。 默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值的修改,必须指定 readwrite 或者 writeonly 的模式。

复制代码
  1. import numpy as np
  2.  
  3. a = np.arange(0,60,5)
  4. a = a.reshape(3,4)
  5. print ('原始数组是:')
  6. print (a)
  7. print ('\n')
  8. for x in np.nditer(a, op_flags=['readwrite']):
  9. x[...]=2*x
  10. print ('修改后的数组是:')
  11. print (a)
  12. 原始数组是:
  13. [[ 0 5 10 15]
  14. [20 25 30 35]
  15. [40 45 50 55]]
  16.  
  17. 修改后的数组是:
  18. [[ 0 10 20 30]
  19. [ 40 50 60 70]
  20. [ 80 90 100 110]]

使用外部循环

nditer 类的构造器拥有 flags 参数,它可以接受下列值:

参数 描述
c_index 可以跟踪 C 顺序的索引
f_index 可以跟踪 Fortran 顺序的索引
multi_index 每次迭代可以跟踪一种索引类型
external_loop 给出的值是具有多个值的一维数组,而不是零维数组
复制代码
  1. import numpy as np
  2. a = np.arange(0,60,5)
  3. a = a.reshape(3,4)
  4. print ('原始数组是:')
  5. print (a)
  6. print ('\n')
  7. print ('修改后的数组是:')
  8. for x in np.nditer(a, flags = ['external_loop'], order = 'F'):
  9. print (x, end=", " )
  10. 原始数组是:
  11. [[ 0 5 10 15]
  12. [20 25 30 35]
  13. [40 45 50 55]]
  14. 修改后的数组是:
  15. [ 0 20 40], [ 5 25 45], [10 30 50], [15 35 55],