numpy之sum()的使用及說(shuō)明
numpy之sum()
sum(a)默認(rèn)為對(duì)輸入?yún)?shù)中的所有元素進(jìn)行求和
>>> a array([ 0, ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, 10, 11]) >>> np.sum(a) 66 >>> b=np.arange(12) >>> b=b.reshape(2,6) >>> b array([[ 0, ?1, ?2, ?3, ?4, ?5], ? ? ? ?[ 6, ?7, ?8, ?9, 10, 11]]) >>> np.sum(b) 66
sum()輸入?yún)?shù)帶有axis時(shí),將按照指定axis進(jìn)行對(duì)應(yīng)求和
>>> b=np.arange(12) >>> b=b.reshape(2,6) >>> b array([[ 0, ?1, ?2, ?3, ?4, ?5], ? ? ? ?[ 6, ?7, ?8, ?9, 10, 11]]) >>> np.sum(b)?? ?#默認(rèn)對(duì)所有元素進(jìn)行求和 66 >>> np.sum(b,axis=0)?? ??? ?#在第一個(gè)軸展開(kāi)方向上求和 array([ 6, ?8, 10, 12, 14, 16]) >>> np.sum(b,axis=1) array([15, 51]) >>>?
sum()輸入?yún)?shù)axis為多個(gè)軸時(shí),則依次按要求在axis上進(jìn)行多次求和
>>> a=np.arange(12).reshape(2,2,3) >>> a array([[[ 0, ?1, ?2], ? ? ? ? [ 3, ?4, ?5]], ? ? ? ?[[ 6, ?7, ?8], ? ? ? ? [ 9, 10, 11]]]) >>> b=np.sum(a,axis=(0,1))?? ?#分別在axis=0 和 1兩個(gè)方向上進(jìn)行求和 >>> b array([18, 22, 26]) >>> b=np.sum(a,axis=(1,2)) >>> b array([15, 51]) >>> b=np.sum(a,axis=(0,1,2))?? ?#由于a為3為矩陣,所有在三個(gè)axis上分別求和相當(dāng)于對(duì)所有元素進(jìn)行求和? >>> b 66
生動(dòng)理解numpy.sum()以及其axis參數(shù)
1、numpy.sum()方法
使用NumPy模塊時(shí),經(jīng)常會(huì)用到numpy.sum()方法,比如計(jì)算一個(gè)多維數(shù)組(ndarray)的所有元素之和:
sum()方法的計(jì)算原理是Sum of array elements over a given axis. 對(duì)指定維度axis上的元素進(jìn)行求和,返回An array with the same shape as a(注:a是求和函數(shù)的輸入數(shù)組), with the specified axis removed. 返回結(jié)果的shape和輸入差不多,只是少了axis那一維度。
所以,如果輸入數(shù)組a的維度是3,shape是 (2,3,5) ,numpy.sum(a, axis=0)返回的數(shù)組shape是 (3,5) ,numpy.sum(a, axis=1)返回的數(shù)組shape是(2,5),numpy.sum(a, axis=2)返回的數(shù)組shape是 (2,3) 。
回到我剛才的問(wèn)題,計(jì)算一個(gè)二維數(shù)組每一列的元素和,那么“列”到底對(duì)應(yīng)哪一維度?axis=0還是axis=1?
arr是一個(gè)2行3列的數(shù)組,我要計(jì)算每一列的元素和,顯然返回結(jié)果的shape應(yīng)該是 (3,),所以axis=0!
sum()中還有一個(gè)參數(shù)是keepdims,默認(rèn)值是False。如果我們想讓返回結(jié)果的維度數(shù)(ndim)和輸入相同,把keepdimes設(shè)置為True就可以了,sum()返回結(jié)果就變成了:返回結(jié)果的shape和輸入差不多,只是axis那一維度值為1。
2、numpy中axis的意義
NumPy用ndarray表示多維數(shù)組,多維數(shù)組,顧名思義,就是有多個(gè)維度的數(shù)組。比如向量(vector)只有一個(gè)維度,它是一維數(shù)組,矩陣(matrix)有兩個(gè)維度,它是二維數(shù)組,三維以上的數(shù)組數(shù)學(xué)上稱為張量(tensor)。
每個(gè)維度就對(duì)應(yīng)一條坐標(biāo)軸。比如平面直角坐標(biāo)系,它是二維的,有兩條坐標(biāo)軸。
axis取值范圍則對(duì)應(yīng)ndarray對(duì)象的維度:一維數(shù)組時(shí)axis=0,二維數(shù)組時(shí)axis=0,1,維數(shù)越高,則axis可取的值越大,數(shù)組n維時(shí),axis=0,1,…,n-1,維度序號(hào)0表示ndarray對(duì)象最外層[]的維度,序號(hào)越大對(duì)應(yīng)ndarray對(duì)象越內(nèi)層[]的維度。
- axis = 0表示按照最外層[]的維度的元素?cái)?shù)目(shape)作分割,做塊與塊之間的運(yùn)算,同時(shí),若keepdims參數(shù)為False(默認(rèn)),還要移除最外層[];
- axis = 1表示對(duì)第二外層[]的維度的元素?cái)?shù)目(shape)作分割,做塊與塊之間的運(yùn)算,同時(shí),若keepdims參數(shù)為False(默認(rèn)),移除第二外層[];
- axis = 2,3,4,5...也如此分析。
3、舉個(gè)更具象的栗子
為了使抽象思考具象化,我根據(jù)生活中熟悉的小區(qū)房屋分布,模擬出一個(gè)開(kāi)發(fā)商樓盤面積分布圖,輔助思考:
3.1、圖中每個(gè)房子各有自己面積(單位:平方米),各個(gè)房子面積數(shù)據(jù)以標(biāo)量形式存儲(chǔ)在一個(gè)4維的,shape=(5,4,3,2)的numpy.array對(duì)象里;
3.2、axis3,2,1,0四個(gè)維度分別代表房號(hào)、層數(shù)、單元號(hào)、小區(qū)期數(shù);
3.3、顯而易見(jiàn),依照小區(qū)的結(jié)構(gòu)來(lái)看,這四個(gè)維度的地位并不相等,它們之間存在層級(jí)關(guān)系,其實(shí)這也正好和numpy.array對(duì)象的數(shù)據(jù)結(jié)構(gòu)一致。所以,如果你喜歡,還可以假設(shè)一座城市有若干個(gè)這樣的小區(qū),然后一個(gè)省有若干個(gè)這樣的城市,一個(gè)國(guó)家有若干個(gè)這樣的省,一個(gè)星球有若干個(gè)這樣的國(guó)家......什么,禁止套娃?哦對(duì),numpy.array的維度就是在套娃嘛,它里面各自的維度可不像長(zhǎng)寬高一樣地位相同;
3.4、再來(lái)解讀一下不同的axis參數(shù)下運(yùn)算的意義(請(qǐng)注意白格子里的數(shù)字是怎樣變化的):
3.4.1 若以sum(axis=0)計(jì)算,則意味著按照單元數(shù)、層數(shù)、房號(hào)都一樣(即axis3,axis2,axis1這3個(gè)維度的index都一樣)的原則,把不同期數(shù)房子的面積匯總成為新的標(biāo)量:
如上圖,標(biāo)量的意義也隨之變化了。這些新的標(biāo)量以shape=(4,3,2)的3個(gè)維度共同構(gòu)成新的數(shù)組。因?yàn)閰R總的是最頂層的維度axis0,所以生成的新數(shù)組只有1個(gè)。它替代了原先最頂層的數(shù)組,自己當(dāng)了大佬,跳出了坑;
3.4.2 若以sum(axis=1)計(jì)算,則意味著按照層數(shù)、房號(hào)都一樣(即axis3,axis2這2個(gè)維度的index都一樣)的原則,在各自期數(shù)的小區(qū)里不同單元房子的面積匯總成為新的標(biāo)量:
如上圖,標(biāo)量的意義也隨之變化了。這些新的標(biāo)量以shape=(3,2)的2個(gè)維度共同構(gòu)成新的數(shù)組。因?yàn)閰R總的維度是axis1,它上層還有size=5的維度axis0,所以生成的新數(shù)組有5個(gè)。它們分別砍掉了各自的shape=(4,3,2)的直系上司,自己做起了shape=(3,2)的中層領(lǐng)導(dǎo)。但可惜他們上層還有一個(gè)size=5的名叫axis0的大佬級(jí)維度沒(méi)砍到,所以老實(shí)蹲在axis0的5個(gè)坑中;
3.4.3 若以sum(axis=2)計(jì)算,則意味著按照房號(hào)都一樣(即axis3這1個(gè)維度的index都一樣)的原則,在各單元里不同層數(shù)房子的面積匯總成為新的標(biāo)量:
如上圖,標(biāo)量的意義也隨之變化了。這些新的標(biāo)量以shape=(2)的1個(gè)維度共同構(gòu)成新的數(shù)組。
因?yàn)閰R總的維度是axis2,它上層還有size=4的維度axis1和size=5的維度axis0,所以生成的新數(shù)組有5x4個(gè),它們分別砍掉了各自的shape=(3,2)的直系上司,自己做起了shape=(2)小領(lǐng)導(dǎo)。但可惜他們上層有size=4的axis1維度,上上層有size=5的axis0維度沒(méi)砍到,所以蹲在axis0和axis1構(gòu)成的5x4個(gè)坑中;
3.4.4 若以sum(axis=3)計(jì)算,則意味著在各層數(shù)里不同房號(hào)房子的面積匯總成為新的標(biāo)量:
如上圖,標(biāo)量的意義也隨之變化了。最底層的維度為1的數(shù)組axis3再降維匯總只能變成標(biāo)量。
因?yàn)閰R總的維度是axis3,它上層還有size=3的維度axis2、size=4的維度axis1和size=5的維度axis0,所以生成的新標(biāo)量有5x4x3個(gè),它們分別砍掉了各自的shape=(2)的直系上司,然鵝自己依舊沒(méi)有下屬,依然是個(gè)標(biāo)量弟弟。且他們上層還有size=3的維度axis2,上上層還有size=4的維度axis1,上上上層還有size=5的維度axis0沒(méi)砍到,所以蹲在axis0和axis1和axis2構(gòu)成的5x4x3個(gè)坑中不能翻身。
4、總結(jié)
以上看出來(lái)什么規(guī)律了嗎?首先,是層次化的結(jié)構(gòu),numpy.array對(duì)象里各個(gè)維度的地位并不相等,如果按地位相等的思考方式來(lái)考慮不同axis參數(shù)的運(yùn)算,那我估計(jì)你腦袋就要炸了。numpy.array對(duì)象里各個(gè)維度之間存在層級(jí)關(guān)系,這是重要的思想方式,因?yàn)榭?分的層級(jí)關(guān)系,才使得眾多維度的變換符合人腦的思維方式,這與樹(shù)形數(shù)據(jù)結(jié)構(gòu)、分治算法等思想不謀而合。
其次,當(dāng)參數(shù)axis選定一個(gè)值(假設(shè)為d)后,那么numpy.array.sum()方法只會(huì)對(duì)指定d維度上的k(假設(shè)k為維度d的元素個(gè)數(shù))個(gè)元素(可以是標(biāo)量、矩陣、或是張量)進(jìn)行合并求和,更高的維度(即維度0,1,...,d-1)的結(jié)構(gòu)不會(huì)發(fā)生變動(dòng)。
至于元素與元素之間的運(yùn)算,如果元素是標(biāo)量,它們的求和你會(huì)吧?這是小學(xué)一年級(jí)的技能。如果矩陣求和呢?不會(huì)請(qǐng)翻本科線性代數(shù)教材。張量求和不會(huì)?別開(kāi)玩笑了,如果你會(huì)矩陣求和,那也自然而然懂得張量求和。不會(huì)的話再回頭看看上面的例子,或者自己找多幾個(gè)例子。
除了sum函數(shù),numpy中諸如argmin等包含axis參數(shù)的函數(shù)工作原理都相同。
最后
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python除法之傳統(tǒng)除法、Floor除法及真除法實(shí)例詳解
本文通過(guò)實(shí)例代碼給大家介紹了Python除法之傳統(tǒng)除法、Floor除法及真除法,需要的朋友可以參考下2019-05-05python如何繪制登陸時(shí)的衛(wèi)星云圖(TBB)
這篇文章主要介紹了python如何繪制登陸時(shí)的衛(wèi)星云圖(TBB),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08python mysql斷開(kāi)重連的實(shí)現(xiàn)方法
這篇文章主要介紹了python mysql斷開(kāi)重連的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python中的進(jìn)程操作模塊(multiprocess.process)
這篇文章介紹了Python中的進(jìn)程操作模塊(multiprocess.process),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05利用python生成一個(gè)導(dǎo)出數(shù)據(jù)庫(kù)的bat腳本文件的方法
下面小編就為大家?guī)?lái)一篇利用python生成一個(gè)導(dǎo)出數(shù)據(jù)庫(kù)的bat腳本文件的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Python(PyS60)實(shí)現(xiàn)簡(jiǎn)單語(yǔ)音整點(diǎn)報(bào)時(shí)
這篇文章主要為大家詳細(xì)介紹了Python(PyS60)實(shí)現(xiàn)簡(jiǎn)單語(yǔ)音整點(diǎn)報(bào)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Python itertools.product方法代碼實(shí)例
這篇文章主要介紹了Python itertools.product方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03