numpy中np.nditer、flags=[multi_index] 的用法說明
在看CS231n的時候,有這么一行代碼
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
查了查np.nditer原來是numpy array自帶的迭代器。這里簡單寫個demo解釋一下np.nditer的用法。
先構(gòu)建一個3x4的矩陣
然后輸入命令
flags=['multi_index']表示對a進(jìn)行多重索引,具體解釋看下面的代碼。
op_flags=['readwrite']表示不僅可以對a進(jìn)行read(讀?。?,還可以write(寫入),即相當(dāng)于在創(chuàng)建這個迭代器的時候,我們就規(guī)定好了有哪些權(quán)限。
迭代一下試一試
print it.multi_index表示輸出元素的索引,可以看到輸出的結(jié)果都是index。
it.iternext()表示進(jìn)入下一次迭代,如果不加這一句的話,輸出的結(jié)果就一直都是(0, 0)。
補(bǔ)充:it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
在看cs221n代碼的時候碰到一行代碼。
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
np.nditer()函數(shù)解析
class np.nditer()
參數(shù):
op : ndarray或array_like的序列。迭代的數(shù)組。
flags : str的序列,可選。用于控制迭代器行為的標(biāo)志。
“buffered”可在需要時啟用緩沖。
“c_index”導(dǎo)致跟蹤C(jī)順序索引。
“f_index”導(dǎo)致跟蹤Fortran-order索引。
“multi_index”導(dǎo)致跟蹤多個索引或每個迭代維度一個索引元組。
“common_dtype”會將所有操作數(shù)轉(zhuǎn)換為公共數(shù)據(jù)類型,并根據(jù)需要進(jìn)行復(fù)制或緩沖。
“copy_if_overlap”使迭代器確定讀操作數(shù)是否與寫操作數(shù)重疊,并根據(jù)需要進(jìn)行臨時復(fù)制以避免重疊。在某些情況下,可能會出現(xiàn)誤報(不必要的復(fù)制)。
“delay_bufalloc”延遲緩沖區(qū)的分配,直到進(jìn)行reset()調(diào)用。允許“allocate”操作數(shù)在其值復(fù)制到緩沖區(qū)之前進(jìn)行初始化。
“external_loop”導(dǎo)致給定的值是具有多個值的一維數(shù)組,而不是零維數(shù)組。
當(dāng)同時使用“buffered”和“external”循環(huán)時,“grow-inner”允許值數(shù)組大小大于緩沖區(qū)大小。
“ranged”允許將迭代器限制為iterindex值的子范圍。
“refs_ok”允許迭代引用類型,例如對象數(shù)組。
“reduce_ok”允許迭代廣播的“readwrite”操作數(shù),也稱為縮減操作數(shù)。
“zerosize_ok”允許itersize為零。
op_flags : str列表,可選。這是每個操作數(shù)的標(biāo)志列表。至少,必須指定“readonly”,“readwrite”或“writeonly”中的一個。
“readonly”表示只讀取操作數(shù)。
“readwrite”表示將讀取和寫入操作數(shù)。
“writeonly”表示只會寫入操作數(shù)。
“no_broadcast”阻止操作數(shù)被廣播。
“contig”強(qiáng)制操作數(shù)數(shù)據(jù)是連續(xù)的。
“aligned”強(qiáng)制操作數(shù)數(shù)據(jù)對齊。
“nbo”強(qiáng)制操作數(shù)數(shù)據(jù)以本機(jī)字節(jié)順序排列。
如果需要,“copy”允許臨時只讀副本。
“updateifcopy”允許在需要時使用臨時讀寫副本。
如果在op參數(shù)中為None,則“allocate”會導(dǎo)致分配數(shù)組。
“no_subtype”阻止“allocate”操作數(shù)使用子類型。
“arraymask”表示此操作數(shù)是在寫入設(shè)置了“writemasked”標(biāo)志的操作數(shù)時用于選擇元素的掩碼。迭代器不強(qiáng)制執(zhí)行此操作,但是當(dāng)從緩沖區(qū)寫回數(shù)組時,它只復(fù)制由此掩碼指示的元素。
'writemasked'表示只寫入所選'arraymask'操作數(shù)為True的元素。
“overlap_assume_elementwise”可用于標(biāo)記僅在迭代器順序中訪問的操作數(shù),以便在存在“copy_if_overlap”時允許不太保守的復(fù)制。
op_dtypes : dtype的dtype 或tuple,可選。操作數(shù)所需的數(shù)據(jù)類型。如果啟用了復(fù)制或緩沖,則數(shù)據(jù)將轉(zhuǎn)換為原始類型或從其原始類型轉(zhuǎn)換。
order: {‘C',‘F',‘A',‘K'},可選
控制迭代順序。'C'表示C順序,'F'表示Fortran順序,'A'表示'F'順序,如果所有數(shù)組都是Fortran連續(xù),否則'C'順序,‘K'表示接近數(shù)組元素出現(xiàn)的順序在內(nèi)存中盡可能。這也會影響“allocate”操作數(shù)的元素內(nèi)存順序,因為它們被分配為與迭代順序兼容。默認(rèn)為'K'。
casting :{‘no', ‘equiv', ‘safe', ‘same_kind', ‘unsafe'},可選??刂七M(jìn)行復(fù)制或緩沖時可能出現(xiàn)的數(shù)據(jù)轉(zhuǎn)換類型。建議不要將此設(shè)置為“unsafe”,因為它會對累積產(chǎn)生不利影響。
“no”表示完全不應(yīng)強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類型。
“equiv”表示只允許更改字節(jié)順序。
“safe”表示只允許保留值的強(qiáng)制轉(zhuǎn)換。
“same_kind”意味著只允許安全的類型或類型內(nèi)的類型,如float64到float32。
“unsafe”表示可以進(jìn)行任何數(shù)據(jù)轉(zhuǎn)換。
op_axes : 整數(shù)列表列表,可選。如果提供,則是每個操作數(shù)的int或None列表。操作數(shù)的軸列表是從迭代器的維度到操作數(shù)的維度的映射??梢詾闂l目放置值-1,從而將該維度視為“newaxis”。
itershape : 整數(shù)元組,可選。迭代器的理想形狀。這允許“allocate”具有由op_axes映射的維度的操作數(shù)不對應(yīng)于不同操作數(shù)的維度,以獲得該維度不等于1的值。
buffersize : int,可選。啟用緩沖時,控制臨時緩沖區(qū)的大小。設(shè)置為0表示默認(rèn)值。
例子1:
默認(rèn)情況下,nditer將視待迭代遍歷的數(shù)組為只讀對象(read-only),為了在遍歷數(shù)組的同時,實現(xiàn)對數(shù)組元素值得修改,必須指定op_flags=['readwrite']模式:
基本迭代參數(shù)flag=['f_index'/'mulit_index'],可輸出自身坐標(biāo)it.index/it.multi_index。
“multi_index”表示對x進(jìn)行表示對x進(jìn)行多重索引。
print("%d <%s>" % (it[0], it.multi_index))表示輸出元素的索引,可以看到輸出的結(jié)果都是index。
下面分別舉例子說明:
import numpy as np x = np.arange(6).reshape(2,3) it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite']) while not it.finished: print("%d <%s>" % (it[0], it.multi_index)) it.iternext() # 0 <(0, 0)> # 1 <(0, 1)> # 2 <(0, 2)> # 3 <(1, 0)> # 4 <(1, 1)> # 5 <(1, 2)>
it.iternext()表示進(jìn)入下一次迭代,如果不加這一句的話,輸出的結(jié)果就一直都是0 <(0, 0)>且不間斷地輸出。
0 <(0, 0)> 0 <(0, 0)> 0 <(0, 0)> 0 <(0, 0)> 0 <(0, 0)> 0 <(0, 0)> ...... ......
例子2:
import numpy as np x = np.arange(6).reshape(2,3) # 單維迭代 it = np.nditer(x, flags=['f_index']) while not it.finished: print("%d <%s>" % (it[0], it.index)) it.iternext() # 0 <0> # 1 <2> # 2 <4> # 3 <1> # 4 <3> # 5 <5>
import numpy as np x = np.arange(6).reshape(2,3) # 多維迭代 it = np.nditer(x, flags=['multi_index']) while not it.finished: print("%d <%s>" % (it[0], it.multi_index)) it.iternext() # 0 <(0, 0)> # 1 <(0, 1)> # 2 <(0, 2)> # 3 <(1, 0)> # 4 <(1, 1)> # 5 <(1, 2)>
例子3:
import numpy as np x = np.arange(6).reshape(2,3) # 列順序迭代 it = np.nditer(x, flags=['f_index'], order='F') while not it.finished: print("%d <%s>" % (it[0], it.index), end=' | ') it.iternext() # 0 <0> | 3 <1> | 1 <2> | 4 <3> | 2 <4> | 5 <5> |
import numpy as np x = np.arange(6).reshape(2,3) # 行順序迭代 it = np.nditer(x, flags=['f_index'], order='C') while not it.finished: print("%d <%s>" % (it[0], it.index), end=' | ') it.iternext() # 0 <0> | 1 <2> | 2 <4> | 3 <1> | 4 <3> | 5 <5> |
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Python數(shù)據(jù)分析應(yīng)用之Matplotlib數(shù)據(jù)可視化詳情
這篇文章主要介紹了Python數(shù)據(jù)分析應(yīng)用之Matplotlib數(shù)據(jù)可視化詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-06-06Python數(shù)據(jù)分析之?Matplotlib?3D圖詳情
本文主要介紹了Python數(shù)據(jù)分析之Matplotlib 3D圖詳情,Matplotlib提供了mpl_toolkits.mplot3d工具包來進(jìn)行3D圖表的繪制,下文總結(jié)了更多相關(guān)資料,需要的小伙伴可以參考一下2022-05-05Python 3.6 中使用pdfminer解析pdf文件的實現(xiàn)
這篇文章主要介紹了Python 3.6 中使用pdfminer解析pdf文件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09django實現(xiàn)登錄時候輸入密碼錯誤5次鎖定用戶十分鐘
這篇文章主要介紹了django實現(xiàn)登錄時候輸入密碼錯誤5次鎖定用戶十分鐘,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11python3格式化字符串 f-string的高級用法(推薦)
從Python 3.6開始,f-string是格式化字符串的一種很好的新方法。與其他格式化方式相比,它們不僅更易讀,更簡潔,不易出錯,而且速度更快!本文重點給大家介紹python3格式化字符串 f-string的高級用法,一起看看吧2020-03-03