numpy中函式nditer的作用

jiangjiane發表於2017-08-24

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]]  

相關文章