主頁 > 知識(shí)庫 > numpy中np.nditer、flags=[multi_index] 的用法說明

numpy中np.nditer、flags=[multi_index] 的用法說明

熱門標(biāo)簽:客戶服務(wù) 電話運(yùn)營中心 企業(yè)做大做強(qiáng) Win7旗艦版 呼叫中心市場(chǎng)需求 語音系統(tǒng) 百度AI接口 硅谷的囚徒呼叫中心

在看CS231n的時(shí)候,有這么一行代碼

it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])

查了查np.nditer原來是numpy array自帶的迭代器。這里簡單寫個(gè)demo解釋一下np.nditer的用法。

先構(gòu)建一個(gè)3x4的矩陣

然后輸入命令

flags=['multi_index']表示對(duì)a進(jìn)行多重索引,具體解釋看下面的代碼。

op_flags=['readwrite']表示不僅可以對(duì)a進(jìn)行read(讀取),還可以write(寫入),即相當(dāng)于在創(chuàng)建這個(gè)迭代器的時(shí)候,我們就規(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代碼的時(shí)候碰到一行代碼。

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”可在需要時(shí)啟用緩沖。

“c_index”導(dǎo)致跟蹤C(jī)順序索引。

“f_index”導(dǎo)致跟蹤Fortran-order索引。

“multi_index”導(dǎo)致跟蹤多個(gè)索引或每個(gè)迭代維度一個(gè)索引元組。

“common_dtype”會(huì)將所有操作數(shù)轉(zhuǎn)換為公共數(shù)據(jù)類型,并根據(jù)需要進(jìn)行復(fù)制或緩沖。

“copy_if_overlap”使迭代器確定讀操作數(shù)是否與寫操作數(shù)重疊,并根據(jù)需要進(jìn)行臨時(shí)復(fù)制以避免重疊。在某些情況下,可能會(huì)出現(xiàn)誤報(bào)(不必要的復(fù)制)。

“delay_bufalloc”延遲緩沖區(qū)的分配,直到進(jìn)行reset()調(diào)用。允許“allocate”操作數(shù)在其值復(fù)制到緩沖區(qū)之前進(jìn)行初始化。

“external_loop”導(dǎo)致給定的值是具有多個(gè)值的一維數(shù)組,而不是零維數(shù)組。

當(dāng)同時(shí)使用“buffered”和“external”循環(huán)時(shí),“grow-inner”允許值數(shù)組大小大于緩沖區(qū)大小。

“ranged”允許將迭代器限制為iterindex值的子范圍。

“refs_ok”允許迭代引用類型,例如對(duì)象數(shù)組。

“reduce_ok”允許迭代廣播的“readwrite”操作數(shù),也稱為縮減操作數(shù)。

“zerosize_ok”允許itersize為零。

op_flags : str列表,可選。這是每個(gè)操作數(shù)的標(biāo)志列表。至少,必須指定“readonly”,“readwrite”或“writeonly”中的一個(gè)。

“readonly”表示只讀取操作數(shù)。

“readwrite”表示將讀取和寫入操作數(shù)。

“writeonly”表示只會(huì)寫入操作數(shù)。

“no_broadcast”阻止操作數(shù)被廣播。

“contig”強(qiáng)制操作數(shù)數(shù)據(jù)是連續(xù)的。

“aligned”強(qiáng)制操作數(shù)數(shù)據(jù)對(duì)齊。

“nbo”強(qiáng)制操作數(shù)數(shù)據(jù)以本機(jī)字節(jié)順序排列。

如果需要,“copy”允許臨時(shí)只讀副本。

“updateifcopy”允許在需要時(shí)使用臨時(shí)讀寫副本。

如果在op參數(shù)中為None,則“allocate”會(huì)導(dǎo)致分配數(shù)組。

“no_subtype”阻止“allocate”操作數(shù)使用子類型。

“arraymask”表示此操作數(shù)是在寫入設(shè)置了“writemasked”標(biāo)志的操作數(shù)時(shí)用于選擇元素的掩碼。迭代器不強(qiáng)制執(zhí)行此操作,但是當(dāng)從緩沖區(qū)寫回?cái)?shù)組時(shí),它只復(fù)制由此掩碼指示的元素。

'writemasked'表示只寫入所選'arraymask'操作數(shù)為True的元素。

“overlap_assume_elementwise”可用于標(biāo)記僅在迭代器順序中訪問的操作數(shù),以便在存在“copy_if_overlap”時(shí)允許不太保守的復(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)存中盡可能。這也會(huì)影響“allocate”操作數(shù)的元素內(nèi)存順序,因?yàn)樗鼈儽环峙錇榕c迭代順序兼容。默認(rèn)為'K'。

casting :{‘no', ‘equiv', ‘safe', ‘same_kind', ‘unsafe'},可選??刂七M(jìn)行復(fù)制或緩沖時(shí)可能出現(xiàn)的數(shù)據(jù)轉(zhuǎn)換類型。建議不要將此設(shè)置為“unsafe”,因?yàn)樗鼤?huì)對(duì)累積產(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ù)列表列表,可選。如果提供,則是每個(gè)操作數(shù)的int或None列表。操作數(shù)的軸列表是從迭代器的維度到操作數(shù)的維度的映射。可以為條目放置值-1,從而將該維度視為“newaxis”。

itershape : 整數(shù)元組,可選。迭代器的理想形狀。這允許“allocate”具有由op_axes映射的維度的操作數(shù)不對(duì)應(yīng)于不同操作數(shù)的維度,以獲得該維度不等于1的值。

buffersize : int,可選。啟用緩沖時(shí),控制臨時(shí)緩沖區(qū)的大小。設(shè)置為0表示默認(rèn)值。

例子1:

默認(rèn)情況下,nditer將視待迭代遍歷的數(shù)組為只讀對(duì)象(read-only),為了在遍歷數(shù)組的同時(shí),實(shí)現(xiàn)對(duì)數(shù)組元素值得修改,必須指定op_flags=['readwrite']模式:

基本迭代參數(shù)flag=['f_index'/'mulit_index'],可輸出自身坐標(biāo)it.index/it.multi_index。

“multi_index”表示對(duì)x進(jìn)行表示對(duì)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> |

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • numpy 實(shí)現(xiàn)返回指定行的指定元素的位置索引
  • Python基礎(chǔ)之Numpy的基本用法詳解
  • Python基礎(chǔ)之numpy庫的使用
  • Python利用numpy實(shí)現(xiàn)三層神經(jīng)網(wǎng)絡(luò)的示例代碼
  • numpy數(shù)據(jù)類型dtype轉(zhuǎn)換實(shí)現(xiàn)
  • Python數(shù)據(jù)清洗工具之Numpy的基本操作

標(biāo)簽:安康 山西 濟(jì)南 海南 長沙 喀什 崇左 山西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《numpy中np.nditer、flags=[multi_index] 的用法說明》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266