numpy中函数nditer的作用

来源:互联网 发布:windows 桌面版qq 编辑:程序博客网 时间:2024/05/16 17:44

numpy中nditer函数用法


转载自:点击打开链接


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

单个数组的迭代(Single Array Iteration)

迭代器最基本的任务的可以完成对数组元素的访问,迭代器接口可以一个接一个地提供的每一个元素。

例如:

[python] view plain copy
  1. a = np.arange(6).reshape(23)  
  2. for x in np.nditer(a):  
  3.     print x, " "  
  4. 0  1  2  3  4  5    
对于这种迭代方式需要注意的是:所选择的顺序是和数组内存布局一致的,而不是使用标准C或者Fortran顺序。这是为了使用效率而设计的,这反映了默认情况下只需访问每个元素,而无需考虑其特定顺序。我们可以通过迭代上述数组的转置来看到这一点,并与以C顺序访问数组转置的copy的方式做对比,有:

[python] view plain copy
  1. a = np.arange(6).reshape(23)  
  2. for x in np.nditer(a.T):  
  3.     print x,  
  4. print "\n"  
  5. for x in np.nditer(a.T.copy(order = 'C')):  
  6.     print x,   
  7.   
  8. 0 1 2 3 4 5   
  9.   
  10. 0 3 1 4 2 5  

从上述例子可以看出,a和a.T的遍历顺序是一样的,也就是他们在内存中的存储顺序也是一样的,但是a.T.copy(order = 'C')的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的。默认是按行访问。

控制迭代顺序(Controlling Iteration Order)

有时候,无论元素在内存中的分布如何,重要的是要以特定的顺序来访问数组。所以nditer提供了一种顺序参数(order parameter 的方法来实现这一要求。默认情况下是order = 'K', 就是上述的访问方式。另外有:order = 'C'和order = 'F'。不妨理解为:C是按行访问,F是按列访问。

[python] view plain copy
  1. a = np.arange(6).reshape(23)  
  2. for x in np.nditer(a, order = 'F'):  
  3.     print x,  
  4. print "\n"  
  5. for x in np.nditer(a.T, order = 'C'):  
  6.     print x,   
  7.   
  8. 0 3 1 4 2 5   
  9.   
  10. 0 3 1 4 2 5  


修改数组值(Modify Array Values)
默认情况下,nditer将输入数组视为只读对象。要修改数组元素,必须指定读写( read-write)或只写(write-only)模式。这是由每个操作数标志控制的。一般而言,Python中的赋值只需更改本地或全局变量字典中的引用,而不是修改现有变量。

[python] view plain copy
  1. a = np.arange(6).reshape(23)  
  2. print a  
  3.   
  4. for x in np.nditer(a, op_flags = ['readwrite']):  
  5.     x[...] = 2*x  
  6.   
  7. print a  
  8.   
  9. [[0 1 2]  
  10.  [3 4 5]]  
  11. [[ 0  2  4]  
  12.  [ 6  8 10]]  

原创粉丝点击