NumPy 數組迭代

NumPy提供了迭代器對象NumPy.nditer,是一個高效的多維迭代器對象,可以使用它對數組進行迭代,使用Python的標準迭代器接口訪問數組元素。

示例

import numpy as np  
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  
print("打印數組:")  
print(a);  

print("\n") 
print("數組迭代:")  
for x in np.nditer(a):  
    print(x, end=' ')  

print("\n") 

複製

輸出

打印數組:
[[ 1  2  3  4]
 [ 2  4  5  6]
 [10 20 39  3]]

數組迭代:
1 2 3 4 2 4 5 6 10 20 39 3

複製

我們知道,numpy中的數組排序有兩種:

  • F(Fortran)風格順序,列排序
  • C(C語言)風格順序,行排序

默認情況下,迭代順序通常受數組的內存佈局影響,不受特定的數組排序(C風格順序/F風格順序)影響。

可以看一下把上面示例中的數組轉置後,對其進行迭代時的順序。

示例

比較數組及其轉置數組的迭代順序:

import numpy as np  
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  
print("打印數組:")  
print(a)  
print("\n") 

print("打印數組的轉置:")  
at = a.T  
print(at)  

print("\n數組迭代:")
for x in np.nditer(a):
    print(x, end=' ')  

print("\n") 

print("\n轉置的數組迭代:")
for x in np.nditer(at):
    print(x, end=' ')  

print("\n") 

複製

輸出

打印數組:
[[ 1  2  3  4]
 [ 2  4  5  6]
 [10 20 39  3]]

打印數組的轉置:
[[ 1  2 10]
 [ 2  4 20]
 [ 3  5 39]
 [ 4  6  3]]

數組迭代:
1 2 3 4 2 4 5 6 10 20 39 3

轉置的數組迭代:
1 2 3 4 2 4 5 6 10 20 39 3

複製

可以看到,這兩個迭代順序是一樣的,轉置沒有影響迭代順序。

迭代順序

要強制按F排序或C排序的順序迭代數組,可在創建迭代對象時顯式指定。

示例

import numpy as np  

a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  

print("\n打印數組:\n")  

print(a)  

print("\n打印數組的轉置:\n")  
at = a.T  

print(at)  

print("\n迭代轉置後的數組\n")  

for x in np.nditer(at):  
    print(x, end= ' ')   

print("\n按C風格順序迭代數組:\n")  
for x in np.nditer(at, order = 'C'):  
    print(x,end=' ')  

複製

輸出

打印數組:

[[ 1  2  3  4]
 [ 2  4  5  6]
 [10 20 39  3]]

打印數組的轉置:

[[ 1  2 10]
 [ 2  4 20]
 [ 3  5 39]
 [ 4  6  3]]

迭代轉置後的數組

1 2 3 4 2 4 5 6 10 20 39 3

按C風格順序迭代數組:

1 2 10 2 4 20 3 5 39 4 6 3 

複製

數組修改

迭代數組時,默認數組值不能修改,因爲迭代對象的op-flag默認被設置爲只讀。如要可修改,可在創建迭代對象時,把op_flags設置爲readwritewrite

示例

import numpy as np  

a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])  

print("\n打印原始數組:\n")  

print(a)  

print("\n遍歷修改後的數組:\n")  

for x in np.nditer(a, op_flags = ['readwrite']):  
    x[...] = 3 * x;  
    print(x,end = ' ')  

複製

輸出

打印原始數組:

[[ 1  2  3  4]
 [ 2  4  5  6]
 [10 20 39  3]]

遍歷修改後的數組:

3 6 9 12 6 12 15 18 30 60 117 9 

複製

廣播迭代

如果兩個數組是可廣播的,可以使用組合的nditer對象對它們進行併發迭代。假設一個數組a的維數爲3X4,而另一個數組b的維數爲1X4,可使用以下類型的迭代器(將數組b廣播到a的大小)。

示例

import numpy as np 
a = np.arange(0,60,5) 
a = a.reshape(3,4) 

print ('數組a:') 
print (a) 
print ('\n')  

print ('數組b:') 
b = np.array([1, 2, 3, 4], dtype = int) 
print (b)  
print ('\n') 

print ('同時迭代2個可廣播的數組:')
for x,y in np.nditer([a,b]): 
   print ("%d:%d" % (x,y))

複製

輸出

數組a:
[[ 0  5 10 15]
 [20 25 30 35]
 [40 45 50 55]]


數組b:
[1 2 3 4]


同時迭代2個可廣播的數組:
0:1
5:2
10:3
15:4
20:1
25:2
30:3
35:4
40:1
45:2
50:3
55:4

複製


Doc navigation

← NumPy 廣播

NumPy 位運算 →

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章