ndarray簡介
????多維數(shù)組對象(ndarray)在運算上非常靈活揩瞪,同長度的數(shù)組之間運算為各對應(yīng)元素間的運算,而數(shù)組與標(biāo)量間的運算篓冲,則會把標(biāo)量應(yīng)用至數(shù)組內(nèi)的每個元素李破。
???? 一個ndarray 內(nèi)所有元素類型一致
ndarray創(chuàng)建
????np.array() 及np.asarray 可以接受格式各樣的數(shù)據(jù),列表字典數(shù)組或其它序列類型
????np.array()及np.asarray()間的區(qū)別在于纹因,當(dāng)傳入的數(shù)據(jù)本身為一個數(shù)組時np.asarray()是不會對其復(fù)制的喷屋。(暫時沒想明白asarray這種特性使用的實際場景)
????np.zero(), np.ones(), np.empty() 分別創(chuàng)建全0,全1瞭恰,全空的數(shù)組(空不是0)屯曹。此外還有np.ones_like()等用于以其它對象限定shape。
????np.arange() 與np.array(range()) 結(jié)果一致惊畏,但是range的步長為小數(shù)時會報錯恶耽。
ndarray數(shù)據(jù)類型
???? 這一部分感覺不需要了解太多,用一般的數(shù)據(jù)類型int, float, str, bool就可以颜启,python會幫你匹配好對應(yīng)格式偷俭。
????使用astype可以轉(zhuǎn)換dtype。(創(chuàng)建新的數(shù)組缰盏,不管dtype有沒有變涌萤,跟前文np.array是一樣的)
????當(dāng)數(shù)組本身為float類型時淹遵,使用astype轉(zhuǎn)換則小數(shù)部分會被去除。
? ??如果數(shù)組為str類型负溪,而表示的全是數(shù)字透揣,可用astype轉(zhuǎn)換為數(shù)值。(就是excel里文本類型單元格的轉(zhuǎn)換為數(shù)字功能)
ndarray基本索引及切片
? ? ndarray的切片可直接賦值一個標(biāo)量川抡,廣播到整個切片辐真,這是list無法做到的。
? ? 數(shù)組的切片是一個視圖崖堤,對其做的任何改變都會反映在原數(shù)組上侍咱,而list的切片則是副本,如果要對數(shù)組復(fù)制為副本密幔,則需使用copy()楔脯。
? ? 注意上例中以b[:] 來表示對b的切片選取,直接寫b = 2的話是直接重新定義變量b老玛。
????高維數(shù)組的索引切片:
? ? 簡單的理解淤年,高維數(shù)組的索引是從高維到低維選取的。
? ? 實際上a[1,2] 的選取是等價于 a[1][2]的蜡豹。
? ? 布爾值索引
? ? 之前提到的索引方式都是基于數(shù)據(jù)所在位置進(jìn)行選取麸粮,工作中遇到的很多條件篩選是基于判斷的,比如說大于100镜廉,或者說是否是17年內(nèi)的弄诲。這種時候需要用布爾值索引選取。
? ? 比如一組數(shù)中選取大于100的娇唯。
? ? 本質(zhì)是a > 100 本身產(chǎn)生了一組布爾值的數(shù)組齐遵,隨后a[a > 100]選取了True索引對應(yīng)的值。比如說我又另一組50個的數(shù)組b塔插,則可以選取這個a > 100的條件梗摇,去看看對應(yīng)的b的值是多少。
? ? 這里順便提一下想许,書上P93上的圖4-2伶授,其中shape那里有幾個shape是(3,)這樣表示的,可能會感到疑惑流纹,我這個shape明明是一維的呀糜烹。實際上這是因為shape是tuple,而tuple是不能接受(3)這種形式的,否則就是產(chǎn)生數(shù)字(list就沒有這種限制)漱凝。當(dāng)然疮蹦,你可以使用tuple([3]),這樣的話產(chǎn)生的結(jié)果就是(3,)茸炒。
? ? 書上94頁在否定這里寫的是負(fù)號表示條件否定愕乎,現(xiàn)在被波浪號替代了阵苇,記得用括號把條件圈起來,尤其是涉及& | 的時候務(wù)必看清楚妆毕。(and or 在布爾型數(shù)組中無效)
? ? 此處注意慎玖,通過布爾型選出的數(shù)據(jù),為數(shù)據(jù)副本笛粘。
花式索引
? ? 在一維上,花式索引實際上就是指可以不連續(xù)湿硝、無順序的取多個索引值薪前。
? ? 對于多維數(shù)組,花式索引為索引元素間一一對應(yīng)的選取关斜∈纠ǎ看文字可能比較難以理解,其實看代碼表現(xiàn)形式就很容易痢畜。
? ? 很容易理解垛膝,此處選取的即[1,2], [3,4], [5,6] 三個數(shù)。而如果想要1,3,5行和2,4,6行的交叉取出的矩形丁稀,則應(yīng)把行列分開選群鹩怠:
? ? 或者使用np.ix_(跟pandas中的ix相似)
? ? 花式索引的結(jié)果為副本。
數(shù)組轉(zhuǎn)置與軸對換
? ? 二維的轉(zhuǎn)置比較簡單线衫,很容易理解凿可。
? ? 對于多維數(shù)組的轉(zhuǎn)置,感覺書上寫的不是很清楚授账。其實就是把原有的軸重新排序枯跑,比如說一個三維數(shù)組,他的原有的軸就是(0,1,2), 轉(zhuǎn)置為(1,0,2)時白热, 即把原先索引為(2,1,3)的數(shù)敛助,轉(zhuǎn)移到(1,2,3)的位置上。而直接使用T屬性屋确,即為轉(zhuǎn)置為反向索引(0,1,2)轉(zhuǎn)置為(2,1,0)
? ? 看a.transpose((0, 2, 1)的輸出結(jié)果可以看到纳击,最高緯度不變,二三維做了個轉(zhuǎn)置乍恐。
? ? T即所有軸反向排列评疗。 ??
? ? ndarray 的swapaxes方法,接受一對軸編號茵烈,將這兩個軸互換百匆。
? ? 注意:所有的轉(zhuǎn)置操作都是返回一個源數(shù)據(jù)的視圖。
通用函數(shù)
? ? 通用函數(shù)就是應(yīng)用于整個數(shù)組內(nèi)的所有元素的函數(shù)呜投,這個跟人的思維習(xí)慣比較相符加匈,你寫代碼的時候肯定更愿意寫abs(array) 而不是 nd.array([abs(i) for i in array])
? ? 具體函數(shù)名稱不用多看存璃,根據(jù)需求在遇到的時候搜索下即可。
利用數(shù)組進(jìn)行數(shù)據(jù)處理
? ? 這里有個很方便的函數(shù):np.where雕拼,使用方式跟excel的if一致,很實用偎球。
? ? 布爾值在數(shù)學(xué)計算中會被強制轉(zhuǎn)換為0、1猫牡,所以可以通過這個特性直接給篩選值計數(shù)淌友。
? ? ndarray的排序和list一樣,可以通過sort方法就地排序。
? ? 若只想創(chuàng)建一個副本主籍,則需要使用函數(shù)np.sort
唯一化及其它集合邏輯
? ? 去重:unique
? ? 選取交集:intersect1d
? ? 選取并集:union1d
? ? 查看從屬關(guān)系(元素):in1d(x,y) ?x中的元素在y中是否包含的布爾數(shù)組颤绕。
? ? 選取集合差:setdiff1d(x, y) ?在x中奥务,不在y中的元素集合氯葬。
? ? 選取集合對稱差:setxor1d(x, y) 在一個集合,且不在另一集合的元素集合秽澳。
文件輸入輸出
? ? np.save保存單數(shù)組始花,np.savez保存多數(shù)組衙荐。save保存后綴默認(rèn)npy,savez默認(rèn)保存后綴npz溜族,savez保存的時候?qū)?shù)組類似于字典進(jìn)行保存煌抒。
? ? 用np.load讀取npz文件時厕倍,輸出結(jié)果為一段內(nèi)存代碼,需要通過索引調(diào)取的形式展示內(nèi)容讹弯。
線性代數(shù)
? ? ? ? 之前提過,shape相同的ndarray之間的加減乘除是元素級的组民,如果想要對矩陣進(jìn)行點積,則要使用dot函數(shù)臭胜。
隨機數(shù)
? ? ? ? np.random.seed()莫其,書上的說法是確定隨機數(shù)生成器的種子。舉個例子乱陡,我每次輸入np.random.randn(5),每次產(chǎn)生的數(shù)組是不一致的仪壮。而每次輸入np.random.seed(5);np.random.randn(5) 產(chǎn)生的結(jié)果會是一模一樣的烙心。但要注意淫茵,在每次產(chǎn)隨機數(shù)前都加上seed铆铆,否則除第一組隨機數(shù)外,后續(xù)的隨機數(shù)并不由seed指定丹喻。
? ? ? ? np.random.permutation薄货,接受一個序列或一個數(shù)字(數(shù)字其實默認(rèn)代表的np.arange(x)),對其重排碍论,不會影響原有序列谅猾。shuffle只能接受序列,就地隨機排列鳍悠。
????????np.random.rand產(chǎn)生均勻分布樣本值税娜,np.random.randint產(chǎn)生范圍內(nèi)整數(shù)隨機值,np.random.randn產(chǎn)生正態(tài)分布樣本值藏研。np.random.normal也產(chǎn)生正太分布敬矩,主要區(qū)別在于normal可調(diào)節(jié)scale,即正太分布那個峰的胖瘦蠢挡。
np.random.randn(5)實際上與np.random.normal(loc = 0, scale = 1,size = (1, 5)) 是一致的弧岳。np.random.uniform產(chǎn)生設(shè)定上下限的均勻分布樣本值。np,random.rand(5) 與 np.random.uniform(low = 0, high = 1, size = (1, 5))一致业踏。
隨機漫步
????????這個地方不難理解禽炬,照著書上敲就可以明白。書中xrange在python3里被整合到range去了堡称,還有書中random.randint(0, 1)不知道在python2中是否取值是[0,1]中的整數(shù)瞎抛,在python3中,取值是[0,1)却紧,這樣會導(dǎo)致照著書得到的結(jié)果是一條斜率為-1的直線桐臊,改成random,randint(0, 2)就好了。另外可以學(xué)習(xí)下這里if的用法晓殊,比較簡便一些断凶。
.