改变numpy的大小_Numpy入门详细教程
序言:python數(shù)據(jù)科學(xué)基礎(chǔ)庫(kù)主要是三劍客:numpy,pandas以及matplotlib,每個(gè)庫(kù)都集成了大量的方法接口,配合使用功能強(qiáng)大。平時(shí)雖然一直在用,也看過(guò)很多教程,但紙上得來(lái)終覺(jué)淺,還是需要自己系統(tǒng)梳理總結(jié)才能印象深刻。本篇先從numpy開(kāi)始,對(duì)numpy常用的方法進(jìn)行思維導(dǎo)圖式梳理,多數(shù)方法僅拉單列表,部分接口輔以解釋說(shuō)明及代碼案例。最后分享了個(gè)人關(guān)于axis和廣播機(jī)制的理解。
01 基本介紹
numpy:numerical python縮寫,提供了底層基于C語(yǔ)言實(shí)現(xiàn)的數(shù)值計(jì)算庫(kù),與python內(nèi)置的list和array數(shù)據(jù)結(jié)構(gòu)相比,其支持更加規(guī)范的數(shù)據(jù)類型和極其豐富的操作接口,速度也更快。
numpy的兩個(gè)重要對(duì)象是ndarray和ufunc,其中前者是數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),后者是接口方法的基礎(chǔ)。
ufunc,通函數(shù),其意義是可以像執(zhí)行標(biāo)量運(yùn)算一樣執(zhí)行數(shù)組運(yùn)算,本質(zhì)即是通過(guò)隱式的循環(huán)對(duì)各個(gè)位置依次進(jìn)行標(biāo)量運(yùn)算。只不過(guò)這里的隱式循環(huán)交由底層C語(yǔ)言實(shí)現(xiàn),因此相比直接用python循環(huán)實(shí)現(xiàn),ufunc語(yǔ)法更為簡(jiǎn)潔、效率更為高效。
索引、迭代和切片操作方式與普通列表比較類似,但是支持更為強(qiáng)大的bool索引。
這部分內(nèi)容比較基礎(chǔ),僅補(bǔ)充一個(gè)個(gè)人認(rèn)為比較有用的ufunc加聚合的例子。ufunc本身屬于方法(方法即是類內(nèi)的函數(shù)接口),ufunc之上還支持4個(gè)方法:
- reduce,聚合方法
- accumulate,累計(jì)聚合
- reduceat,按指定軸向、指定切片聚合
- outer:外積
當(dāng)然,后兩個(gè)用處較少也不易理解,前兩個(gè)在有些場(chǎng)景下則比較有用:
02 數(shù)組創(chuàng)建
numpy中支持5類創(chuàng)建數(shù)組的方式:
- 從普通數(shù)據(jù)結(jié)構(gòu)創(chuàng)建,如列表、元組等
- 從特定的array結(jié)構(gòu)創(chuàng)建,支持大量方法,例如ones、zeros、empty等等
- empty接收指定大小創(chuàng)建空數(shù)組,這里空數(shù)組的意義在于未進(jìn)行數(shù)值初始賦值,隨機(jī)產(chǎn)生,因而速度要更快一些
- linspace和arange功能類似,前者創(chuàng)建指定個(gè)數(shù)的數(shù)值,后者按固定步長(zhǎng)創(chuàng)建,其中l(wèi)inspace默認(rèn)包含終點(diǎn)值(可以通過(guò)endpoint參數(shù)設(shè)置為false),而arange則不含終點(diǎn)
- 從磁盤讀取特定的文件格式
- 從緩存或字符讀入數(shù)組
- 從特定的庫(kù)函數(shù)創(chuàng)建,例如random隨機(jī)數(shù)包
以上方法中,最為常用的是方法1、2、5。
03 數(shù)組增刪
numpy提供了與列表類似的增刪操作,其中
- append是在指定維度后面拼接數(shù)據(jù),要求相應(yīng)維度大小匹配
- insert可以在指定維度任意位置插入數(shù)據(jù),要求維度大小匹配
- delete刪除指定維度下的特定索引對(duì)應(yīng)數(shù)據(jù)
三種方法需要接收一個(gè)axis參數(shù),如果未指定,則均會(huì)先對(duì)目標(biāo)數(shù)組展平至一維數(shù)組后再執(zhí)行相應(yīng)操作。
04 數(shù)組變形
數(shù)組變形是指對(duì)給定數(shù)組重新整合各維度大小的過(guò)程,numpy封裝了4類基本的變形操作:轉(zhuǎn)置、展平、尺寸重整和復(fù)制。主要方法接口如下:
- reshape常用于對(duì)給定數(shù)組指定維度大小,原數(shù)組不變,返回一個(gè)具有新形狀的新數(shù)組;如果想對(duì)原數(shù)組執(zhí)行inplace變形操作,則可以直接指定其形狀為合適維度
- resize與reshape功能類似,主要有3點(diǎn)區(qū)別:
- resize面向?qū)ο蟛僮鲿r(shí),執(zhí)行inplace操作,調(diào)用np.resize類方法時(shí)則不改變?cè)瓟?shù)組形狀;而reshape無(wú)論如何都不改變?cè)瓟?shù)組形狀
- resize變形后的數(shù)組大小可以不和原數(shù)組一致,會(huì)自動(dòng)根據(jù)新尺寸情況進(jìn)行截?cái)嗷蚱唇?/li>
- 正因?yàn)閞esize可以執(zhí)行截?cái)?#xff0c;所以要求接收確切的尺寸參數(shù),不允許出現(xiàn)-1這樣的"非法"數(shù)值;而reshape中常用-1的技巧實(shí)現(xiàn)某一維度的自動(dòng)計(jì)算
另外,當(dāng)resize新尺寸參數(shù)與原數(shù)組大小不一致時(shí),要求操作對(duì)象具有原數(shù)組的,而不能是view或簡(jiǎn)單賦值。(具體參考08 視圖與拷貝一節(jié))
- ravel和flat功能類似,均返回對(duì)數(shù)組執(zhí)行展平后的結(jié)果,且不改變?cè)瓟?shù)組形狀,區(qū)別在于:
- 前者是方法接口,而后者是屬性接口,
- 前者返回對(duì)象類型仍然是數(shù)組,而后者返回對(duì)象類型是專用的flatten類型,一般用作迭代器對(duì)象
- transpose與T均執(zhí)行轉(zhuǎn)置操作,前者是方法,后者是屬性
- tile和repeat方法類似,均為對(duì)給定數(shù)組執(zhí)行復(fù)制操作,區(qū)別在于:
- tile面向整個(gè)數(shù)組復(fù)制,而repeat面向數(shù)組元素復(fù)制
- tile不接收維度參數(shù),而repeat需指定維度參數(shù),否則會(huì)對(duì)數(shù)組先展平再?gòu)?fù)制
05 數(shù)組拼接
數(shù)組拼接也是常用操作之一,主要有3類接口:
- concatenate,對(duì)給定的多個(gè)數(shù)組按某一軸進(jìn)行拼接,要求所有數(shù)組具有相同的維度(ndim相等)、且在非拼接軸大小一致
- stack系列,共6個(gè)方法:
- hstack,column_stack:功能基本一致,均為水平堆疊(axis=1),或者說(shuō)按列堆疊。唯一的區(qū)別在于在處理一維數(shù)組時(shí):hstack按axis=0堆疊,且不要求兩個(gè)一維數(shù)組長(zhǎng)度一致,堆疊后仍然是一個(gè)一維數(shù)組;而column_stack則會(huì)自動(dòng)將兩個(gè)一維數(shù)組變形為Nx1的二維數(shù)組,并仍然按axis=1堆疊,自然也就要求二者長(zhǎng)度一致,堆疊后是一個(gè)Nx2的二維數(shù)組
- vstack,row_stack,功能一致,均為垂直堆疊,或者說(shuō)按行堆疊,axis=0
- dstack,主要面向三維數(shù)組,執(zhí)行axis=2方向堆疊,輸入數(shù)組不足3維時(shí)會(huì)首先轉(zhuǎn)換為3維,主要適用于圖像處理等領(lǐng)域
- stack,進(jìn)行升維堆疊,執(zhí)行效果與前幾種堆疊方式基本不同,要求所有數(shù)組必須具有相同尺寸。堆疊后,一維變二維、二維變?nèi)S……
- 魔法方法:r_[ ],c_[ ],效果分別與row_stack和column_stack類似,但具體語(yǔ)法要求略有不同。另外,雖然不是函數(shù),但第一個(gè)參數(shù)可以是一個(gè)字符串實(shí)現(xiàn)特定功能設(shè)置。
06 數(shù)組切分
數(shù)組切分可以看做是數(shù)組拼接的逆操作,分別對(duì)應(yīng):
- hsplit:水平切分,要求切分后大小相等,維數(shù)不變,可以切分一維數(shù)組
- vsplit:垂直切分,要求切分后大小相等,維數(shù)不變,要求至少二維以上
- dsplit:縱深切分,要求切分后大小相等,維數(shù)不變,至少三維數(shù)組
- split:通過(guò)接收一個(gè)axis參數(shù)實(shí)現(xiàn)任意切分,默認(rèn)axis=0,若設(shè)置axis=1或2則可分別實(shí)現(xiàn)vstack和dstack
- array_split:前面4個(gè)方法均要求實(shí)現(xiàn)相同大小的子數(shù)組切分,當(dāng)切分份數(shù)無(wú)法實(shí)現(xiàn)整除時(shí)會(huì)報(bào)錯(cuò)。array_split則可以適用于近似相等條件下的切分,也接受一個(gè)axis參數(shù)實(shí)現(xiàn)指定軸向
07 基本統(tǒng)計(jì)量
numpy可以很方便的實(shí)現(xiàn)基本統(tǒng)計(jì)量,而且每種方法均包括對(duì)象方法和類方法:
- max,argmax分別返回最大值和最大值對(duì)應(yīng)索引,可接收一個(gè)axis參數(shù),指定軸線的聚合統(tǒng)計(jì)。對(duì)于二維及以上數(shù)組,若不指定axis,即axis=None,此時(shí)對(duì)數(shù)組所有數(shù)值求聚合統(tǒng)計(jì)
- min,argmin,與最大一致
- mean、std,分別求均值和標(biāo)準(zhǔn)差,也可接收一個(gè)缺省參數(shù)axis實(shí)現(xiàn)特定軸向聚合統(tǒng)計(jì)或全局聚合
- var、cov,分別求方差和協(xié)方差,與均值標(biāo)準(zhǔn)差類似
- sort、argsort,分別返回排序后的數(shù)組和相應(yīng)索引,接收一個(gè)axis參數(shù),默認(rèn)為axis=-1,按最后一個(gè)軸向,若axis=None表示先展平成一維數(shù)組后再排序;另外可設(shè)置排序算法,如快排、堆排或歸并等
08 視圖與拷貝
與列表的操作類似,numpy的數(shù)組類型也存在深淺拷貝之分:
- 直接賦值:無(wú)拷貝,相當(dāng)于是引用
- view():建立視圖,淺拷貝,形狀可以不一致,但數(shù)據(jù)相同
- copy():深拷貝,完全獨(dú)立的對(duì)象
注:正因?yàn)橘x值和view操作后兩個(gè)數(shù)組的數(shù)據(jù)共享,所以在前面resize試圖更改數(shù)組形狀時(shí)可以執(zhí)行、但更改元素個(gè)數(shù)時(shí)會(huì)報(bào)錯(cuò)。
09 特殊常量
numpy提供了一些特殊的常量,值得注意的是np.newaxis可以用作是對(duì)數(shù)組執(zhí)行升維操作,效果與設(shè)置為None一致。
10 隨機(jī)數(shù)包
Random是numpy下的一個(gè)子包,內(nèi)置了大量的隨機(jī)數(shù)方法接口,包括絕大部分概率分布接口,常用的主要還是均勻分布和正態(tài)分布:
- 均勻分布:random、rand、uniform,三者功能具有相似性,其中前兩者均產(chǎn)生指定個(gè)數(shù)的0-1之間均勻分布,而uniform可通過(guò)設(shè)置參數(shù)實(shí)現(xiàn)任意區(qū)間的均勻分布;當(dāng)需要產(chǎn)生整數(shù)均勻分布時(shí),可用randint
- 正態(tài)分布:randn,normal,前者生成標(biāo)準(zhǔn)正態(tài)分布(均值為0,方差為1),后者產(chǎn)生任意正態(tài)分布,接收一個(gè)loc參數(shù)作為均值,scale參數(shù)作為標(biāo)準(zhǔn)差
- permutation、shuffle,對(duì)給定序列實(shí)現(xiàn)隨機(jī)排列,前者返回一個(gè)新數(shù)組,后者是inplace操作
- seed,因?yàn)橛?jì)算機(jī)中的隨機(jī)數(shù)嚴(yán)格講都是偽隨機(jī),需要依賴一個(gè)隨機(jī)數(shù)種子來(lái)不斷生成新的隨機(jī)數(shù),seed可以用于固定這個(gè)隨機(jī)種子。當(dāng)指定隨機(jī)數(shù)種子后,后續(xù)的隨機(jī)將得到固化
11 線性代數(shù)包
除了隨機(jī)數(shù)包,numpy下的另一個(gè)常用包是線性代數(shù)包,常見(jiàn)的矩陣操作均位于此包下。由于點(diǎn)積dot()和向量點(diǎn)積vdot()操作使用較為頻繁,所以全局可用。
12 關(guān)于axis的理解
由于numpy的基本數(shù)據(jù)結(jié)構(gòu)是多維數(shù)組,很多接口方法均存在維度的問(wèn)題,按照不同維度執(zhí)行操作結(jié)果往往不同,例如拼接、拆分、聚合統(tǒng)計(jì)等,此時(shí)一般需要設(shè)置一個(gè)維度參數(shù),即axis。由于很多教程因?yàn)榉g或語(yǔ)言習(xí)慣不同,存在眾說(shuō)紛紜、口徑不一的問(wèn)題,有的說(shuō)axis=0是橫軸,有的說(shuō)是縱向,所以如何理解axis的含義可能是很多numpy初學(xué)者的常見(jiàn)困擾之一,筆者也是如此。
這一問(wèn)題困擾了好久,直至一次無(wú)意間看到了相關(guān)源碼中的注釋:
例如,在sort方法中,axis參數(shù)的解釋為"Axis along which to sort",翻譯過(guò)來(lái)就是沿著某一軸執(zhí)行排序。這里的沿著一詞用得恰到好處,形象的描述了參數(shù)axis的作用,即相關(guān)操作是如何與軸向建立聯(lián)系的,在具體解釋之前,先介紹下axis從小到大的順序問(wèn)題。axis從小到大對(duì)應(yīng)軸的出場(chǎng)順序先后,或者說(shuō)變化快慢:axis=0對(duì)應(yīng)主軸,沿著行變化的方向,可以理解為在多重for循環(huán)中最外面的一層,對(duì)應(yīng)行坐標(biāo),數(shù)值變化最慢;而axis=1對(duì)應(yīng)次軸,沿著列變化的方向,在多重for循環(huán)中變化要快于axis=0的軸向。類似地,如果有更高維度則依次遞增。
至此,再來(lái)理解這里axis沿著的意義。舉個(gè)例子,axis=0代表沿著行變化的方向,那么自然地,切分方法split(axis=0)接口對(duì)應(yīng)vsplit,因?yàn)槭菍?duì)行切分,即垂直切分;而split(axis=1)接口則對(duì)應(yīng)hsplit,因?yàn)槭菍?duì)列切分,即水平切分;split(axis=2)則對(duì)應(yīng)dsplit。類似的,np.sort(axis=0)必然是沿著行方向排序,也就是分別對(duì)每一列執(zhí)行排序。想必這樣理解,應(yīng)該不會(huì)存在混淆了。
13 關(guān)于廣播機(jī)制
可能困擾numpy初學(xué)者的另一個(gè)用法是numpy的一大利器:廣播機(jī)制。廣播機(jī)制是指執(zhí)行ufunc方法(即對(duì)應(yīng)位置元素1對(duì)1執(zhí)行標(biāo)量運(yùn)算)時(shí),可以確保在數(shù)組間形狀不完全相同時(shí)也可以自動(dòng)的通過(guò)廣播機(jī)制擴(kuò)散到相同形狀,進(jìn)而執(zhí)行相應(yīng)的ufunc方法。當(dāng)然,這里的廣播機(jī)制是有條件的:
條件很簡(jiǎn)單,即從兩個(gè)數(shù)組的最后維度開(kāi)始比較,如果該維度滿足維度相等或者其中一個(gè)大小為1,則可以實(shí)現(xiàn)廣播。當(dāng)然,維度相等時(shí)相當(dāng)于未廣播,所以嚴(yán)格的說(shuō)廣播僅適用于某一維度從1廣播到N;如果當(dāng)前維度滿足廣播要求,則同時(shí)前移一個(gè)維度繼續(xù)比較。為了直觀理解這個(gè)廣播條件,舉個(gè)例子,下面的情況均滿足廣播條件:
而如下例子則無(wú)法完成廣播:
好吧,以上例子其實(shí)都源自numpy官方文檔。具體可參考../numpy/doc/Broadcasting.py文件。另外,doc包下還包括很多說(shuō)明文檔,對(duì)于深刻理解numpy運(yùn)行機(jī)制大有裨益。
再補(bǔ)充一句:這里或許有人好奇,為什么必須要1對(duì)N才能廣播,N的任意因數(shù)(比如N/2、N/3等)不是都可以"合理"廣播到N嗎?對(duì)此,個(gè)人也曾有此困惑,我的理解是這里的合理只是數(shù)學(xué)意義下的合理,但數(shù)組表征值意義下往往不合理,因?yàn)槿狈忉屝?#xff01;比如2可以廣播到12,但此時(shí)該怎樣理解這其中的廣播意義呢?奇偶不同?那3廣播到12呢?4廣播到12呢?還是欠缺解釋性。所以numpy限制必須是1廣播到N或者二者相等,才可以廣播。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的改变numpy的大小_Numpy入门详细教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ENSP配置 实例五 RIP配置
- 下一篇: matlab各个指令的含义,[MATLA