使用nditer可以完成逐個訪問陣列中的元素。
a = np.arange(4).reshape(2, 2)
for i in a:
print(i)
for i in np.nditer(a):
print(i)
結果:
[0 1]
[2 3]01
23
對於一維陣列結果一樣,但是多維就有區別了
nditer物件提供了乙個order引數來控制迭代順序。其引數order有三個可選引數:k,f,c
具有上述行為的預設值是order ='k』以保持現有訂單。 對於c順序,可以使用order ='c』覆蓋它,對於fortran順序,可以使用order ='f』覆蓋它。
其中「k」是預設的,其結果與與原來的沒有區別,逐個讀取元素;
「c」:c order,即行序優先;;
「f」:fortran order,即列序優先;
2.1二維
a = np.arange(6).reshape(2, 3)
print(a)
for i in np.nditer(a, order='c'):
print(i)
print("---------")
for i in np.nditer(a, order='f'):
print(i)
print("---------")
for i in np.nditer(a, order='k'):
print(i)
結果:
[[0 1 2]
[3 4 5]]01
2345
---------03
1425
---------01
2345
可以看出二維情況下"f"引數確實就是可以看過按列讀取元素
2.2三維
a = np.arange(18).reshape(2, 3, 3)
print(a)
for i in np.nditer(a, order='c'):
print(i)
print("---------")
for i in np.nditer(a, order='f'):
print(i)
print("---------")
for i in np.nditer(a, order='k'):
print(i)
結果:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]]01
2345
6789
1011
1213
1415
1617
---------09
312615
110413
716211
514817
---------01
2345
6789
1011
1213
1415
1617
注意三維陣列列序優先時的讀取順序。
並不推薦這種方法來修改陣列值,可以作為參考
預設情況下,nditer將輸入陣列視為唯讀物件。 要修改陣列元素,必須指定讀寫或只寫模式。 這是用每運算元標誌控制的。
python中的常規賦值只是更改本地或全域性變數字典中的引用,而不是修改現有變數。 這意味著簡單地分配給x不會將值放入陣列的元素中,而是將x作為陣列元素引用切換為對指定值的引用。 要實際修改陣列的元素,x應該用省略號索引。
a = np.arange(6).reshape(2, 3)
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2*x
print(a)
[[ 0 2 4]
[ 6 8 10]]
在目前為止的所有示例中,a的元素由迭代器一次提供乙個,因為所有迴圈邏輯都是迭代器的內部邏輯。 雖然這很簡單方便,但效率不高。 更好的方法是將一維最內層迴圈移動到迭代器外部的**中。 這樣,numpy的向量化操作可以用在被訪問元素的較大塊上。
nditer將嘗試提供盡可能大的內部迴圈塊。 通過強制』c』和』f』順序,我們得到不同的外部迴圈大小。 通過指定迭代器標誌來啟用此模式。
a = np.arange(6).reshape(2, 3)
for x in np.nditer(a, flags=['external_loop'], order='c'):
print(x)
print("--------------")
for x in np.nditer(a, flags=['external_loop'], order='f'):
print(x)
結果:注意行序優先中輸出的乙個陣列,而不是乙個個的數字元素
[0 1 2 3 4 5]
--------------
[0 3]
[1 4]
[2 5]
在迭代期間,你可能希望在計算中使用當前元素的索引。 例如,你可能希望按記憶體順序訪問陣列的元素,然後使用c順序,fortran順序或多維索引來查詢不同陣列中的值。
5.1multi_index
下面**中order引數根據自己需要選擇,也可以不寫預設按行逐個讀取元素
a = np.arange(6).reshape(2, 3)
it = np.nditer(a, flags=['multi_index'], order="f")
while not it.finished:
print("%d < %s>" %(it[0], it.multi_index))
it.iternext()
結果: it.multi_index代表元素的索引,以元組形式輸出
0 < (0, 0)>
3 < (1, 0)>
1 < (0, 1)>
4 < (1, 1)>
2 < (0, 2)>
5 < (1, 2)>
5.2 f_indexa = np.arange(6).reshape(2, 3)
it = np.nditer(a, flags=['f_index'])
while not it.finished:
print("%d < %d>" % (it[0], it.index))
it.iternext()
結果:索引的編號,以列序優先
0 < 0>
1 < 2>
2 < 4>
3 < 1>
4 < 3>
5 < 5>
通過啟用緩衝模式,迭代器提供給內部迴圈的塊可以變得更大,從而顯著減少python直譯器的開銷。 在強制fortran迭代順序的示例中,當啟用緩衝時,內部迴圈可以一次性檢視所有元素。
a = np.arange(6).reshape(2, 3)
for x in np.nditer(a, flags=['external_loop','buffered'], order='f'):
print(x)
輸出:
[0 3 1 4 2 5]
**:
a = np.arange(3)
b = np.arange(6).reshape(2,3)
for x, y in np.nditer([a,b]):
print("%d:%d" % (x,y))
輸出:
0:0
1:12:2
0:31:4
2:5
NumPy 教程(第 10 章) 陣列迭代
numpy 迭代器物件 numpy.nditer 提供了一種靈活訪問乙個或者多個陣列元素的方式,迭代器最基本的任務的可以完成對陣列元素的訪問 使用 arange 函式建立乙個 2x3 陣列,並使用 nditer 對它進行迭代 in 1 import numpy as np in 2 num np.a...
Struts2標籤迭代陣列彙總
1.一維陣列 2.list 3.map key value 4 遍歷資料棧.簡單的list類,list class attr 5 遍歷2個list listattrn listattrv 這2個list的元素是一一對應的,乙個attrn對應乙個attrv s iterator value id id...
Struts2標籤迭代陣列彙總
1.一維陣列 2.list 3.map key value 4 遍歷資料棧.簡單的list類,list class attr 5 遍歷2個list listattrn listattrv 這2個list的元素是一一對應的,乙個attrn對應乙個attrv s iterator value id id...