numpy迭代陣列nditer

2021-09-26 04:28:35 字數 4064 閱讀 8992

使用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_index
a = 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...