一、前言
玩數(shù)據(jù)分析、數(shù)據(jù)挖掘、AI的都知道這個(gè)python庫用的是很多的,里面包含各種操作,在實(shí)際的dataset的處理當(dāng)中是非常常用的,這里我做一個(gè)總結(jié),方便自己看,也方便大家看,我準(zhǔn)備做一個(gè)非常細(xì)致的分類,每個(gè)分類有對應(yīng)的numpy常用用法,以后見到或者用到再一個(gè)個(gè)慢慢加進(jìn)來,如果我還用csdn我就會移植update下去。
二、下載、安裝、導(dǎo)入
用anaconda安裝是十分方便的,如果你已經(jīng)安裝了tf,keras之類的,其實(shí)已經(jīng)直接把numpy安裝了,一般來說安裝就是pip命令。
1pipinstallnumpy#py22pip3installnumpy#py3
用法則是
1importnumpyasnp#一般as為np來操作
三、常用用法總結(jié)
1.a(chǎn)rray基本信息以及生成各種常見array基本操作
生成array,得到對應(yīng)的基本信息
1importnumpyasnp 2 3array=np.array([[1,2,3], 4[2,3,4]]) 5 6printarray#numpy生成的array 7printarray.dtype#每個(gè)元素的類型 8print"numberofdim",array.ndim#array的維度 9print'shape:',array.shape#形狀,兩行三列。10print'size:',array.size#array的大小=array中所有元素的個(gè)數(shù)11"""12[[123]13[234]]14int6415numberofdim216shape:(2,3)17size:618"""
array的生成就是np.array(list),本質(zhì)上是把定義的list轉(zhuǎn)換成array,因?yàn)閍rray可以進(jìn)行更加方便地計(jì)算和操作,比如矩陣的轉(zhuǎn)置和相乘。
array的dtype設(shè)置
1importnumpyasnp 2 3a=np.array([2,23,4],dtype=np.float32) 4print"a'sdtype",a.dtype 5aa=np.array([2,23,4],dtype=np.int) 6print"aa'sdtype",aa.dtype 7aaa=np.array([2,23,4]) 8print"aaa'sdtype",aaa.dtype 9aaaa=np.array([2.2,23.2,4.2])10print"aaaa'sdtype",aaaa.dtype11aaaaa=np.array([2,23,4],dtype=np.int64)12print"aaaaa'sdtype:",aaaaa.dtype1314"""15a'sdtypefloat3216aa'sdtypeint6417aaa'sdtypeint6418aaaa'sdtypefloat6419aaaaa'sdtype:int6420"""
由可以得到一個(gè)結(jié)論就是如果定義的array里面的list的元素本身為整數(shù)的話,不設(shè)置type,則默認(rèn)為int64,如果設(shè)置為int類型而沒有設(shè)置字節(jié)大小則還是默認(rèn)為int64,如果元素本身為小數(shù),則默認(rèn)為float64。所以如果用int64,則如果元素都為整數(shù)則不需要設(shè)置默認(rèn)即可,設(shè)置其他類型需要設(shè)置,float類似。
生成常見array格式
1a1=np.zeros((2,3),dtype=np.int)#生成shape=(2,3)的全為0的array 2 3printa1 4""" 5[[000] 6[000]] 7""" 8 9a2=np.ones((3,4),dtype=np.int16)#生成shape=(3,4)的全為1的array1011printa212"""13[[1111]14[1111]15[1111]]16"""
這里注意shape=(a,b),在填入shape的參數(shù)的時(shí)候一定要加括號,以下雷同。
1a3=np.empty((3,4))#生成shape=(3,4)的全為接近空的array 2printa3 3""" 4[[6.92259773e-3104.67497449e-3106.92259751e-3106.92259750e-310] 5[2.37151510e-3223.16202013e-3220.00000000e+0006.92257087e-310] 6[6.92259748e-3106.92257087e-3106.92257063e-3106.92257063e-310]] 7""" 8a4=np.arange(10,20,2)#生成array10到20每隔2的一增加,for循環(huán)中主要使用 9printa410"""11[1012141618]12"""1314a5=np.arange(12)#生成array0到12-1=11每一個(gè)增加,for循環(huán)中非常常用15printa516"""17[01234567891011]18"""1920a6=np.arange(12).reshape((3,4))#這里主要展示reshape的功能,能夠重新定義矩陣的形狀21printa622"""23[[0123]24[4567]25[891011]]26"""27 # 1和10之間4個(gè)元素越過,這個(gè)主要應(yīng)用在插值運(yùn)算或者matplotlib畫光滑曲線的時(shí)候計(jì)算用到。28a7=np.linspace(1,10,4).reshape((2,2))2930printa731"""32[[1.4.]33[7.10.]]3435"""
2.a(chǎn)rray之間的計(jì)算
加減法
相同維度:
1importnumpyasnp 2 3a=np.array([10,20,30,40]) 4b=np.arange(4) 5print"a:",a 6print"b:",b 7c=a+b 8print"c:",c 9c1=a-b10print"c1:",c111"""12a:[10203040]13b:[0123]14c:[10213243]15c1:[10192837]16"""
不同維度:
1aa=np.array([[1,2,3,4], 2[11,22,33,44]]) 3 4bb=np.arange(4) 5 6print"aa:",aa 7print"bb:",bb 8print"a+b:",aa+bb 910"""11aa:[[1234]12[11223344]]13bb:[0123]14a+b:[[1357]15[11233547]]16"""
如果是不同維度的array進(jìn)行加減法的話,程序就是把維度低的array自動復(fù)制擴(kuò)展到大維度的array,進(jìn)行相加當(dāng)然前提條件是兩個(gè)不同維度的array進(jìn)行相加的時(shí)候,低維度的array的shape也要和高維度的array其中一個(gè)shape相同,例如上面代碼所示,(2,4) (1,4) 都有個(gè)shape為4
乘除法
1d=np.array([[1,2], 2[3,4]]) 3e=np.arange(1,8,2).reshape((2,2)) 4print"d:",d 5print"e:",e 6 7print"d*e:",d*e#對應(yīng)元素相乘 8print"d/e",d/e#對應(yīng)元素相除,因?yàn)槭莍nt64類型所以類似于2/3=0 9"""10d:[[12]11[34]]12e:[[13]13[57]]14d*e:[[16]15[1528]]16d/e[[10]17[00]]18"""
不同緯度的乘除法和上面加減法解析情況一樣,可對比來看。
平方,三角函數(shù),比較元素大小
1a=np.array([10,20,30,40]) 2b=np.arange(4) 3c2=b**2#平方 4print"c2:",c2 5 6c3=10*np.sin(a)#sin函數(shù) 7print"c3:",c3 8""" 9c2:[0149]10c3:[-5.440211119.12945251-9.880316247.4511316]11"""12print"b:",b13print"b:",b3?# b中小于3的都為TRUE14print?"b:",?b?==?3?#?b中等于3的為TRUE15"""16b:?[0?1?2?3]17b:?[?True??True??True?False]18b:?[False?False?False??True]1920"""
矩陣相乘
1d=np.array([[1,2], 2[3,4]]) 3e=np.arange(1,8,2).reshape((2,2)) 4print"d:",d 5print"e:",e 6printnp.dot(d,e) 7printd.dot(e) 8""" 9d:[[12]10[34]]11e:[[13]12[57]]13[[1117]#例如11為1*1+2*5=1114[2337]]15[[1117]16[2337]]1718"""
np.dot(d, e) 與d.dot(e)一樣,都為d和e進(jìn)行矩陣相乘
隨機(jī)數(shù)和max,min,sum
1f=np.random.random((2,4))#隨機(jī)產(chǎn)生shape為(2,4)的一個(gè)array,每個(gè)元素都為0-1之間隨機(jī)生成 2printf 3print"=------=" 4printnp.sum(f) 5printnp.min(f) 6printnp.max(f) 7""" 8[[0.110275230.848419910.598669920.92557867] 9[0.999175220.27715650.255781980.06671013]]10=------=114.081767552987877120.06671012832269874130.999175215388682714"""15print"============="16printnp.sum(f,axis=0)17printnp.min(f,axis=1)18printnp.max(f,axis=0)19"""20[1.109450441.125576410.85445190.9922888]21[0.110275230.06671013]22[0.999175220.848419910.598669920.92557867]23"""
顧名思義,sum為總,min為最小,max為最大,如果不設(shè)置axis維度參數(shù)的話,則都為整個(gè)array的元素來說,但一般我們運(yùn)用都只是算某個(gè)維度的sum,max,min,在二維數(shù)據(jù)中,axis=0代表行,第一個(gè)維度,axis=1,代表列為第二個(gè)維度,其實(shí)這么記并不是很好很有可能記錯(cuò),我一般都是這么記得:axis=0為行,那意思就是每一行都要算唄?算完那不就是一列的每一行算個(gè)數(shù)被,axis=1類推,多維數(shù)據(jù)類推即可
矩陣轉(zhuǎn)置和排序,以及元素比較大小重置元素方法
1c=np.arange(14,2,-1).reshape((3,4)) 2 3printc 4print"sort:",np.sort(c)#每一行進(jìn)行重新大小排序當(dāng)然也有axis參數(shù)配置,根據(jù)我的axis參數(shù)說明來操作 5 6printnp.transpose(c)#轉(zhuǎn)置同下面操作 7printc.T#轉(zhuǎn)置同上面操作 8 9print"clip:",np.clip(c,5,9)#c矩陣中的元素小于5的等于5,大于9的等于910"""11[[14131211]12[10987]13[6543]]14sort:[[11121314]15[78910]16[3456]]17[[14106]18[1395]19[1284]20[1173]]21[[14106]22[1395]23[1284]24[1173]]25clip:[[9999]26[9987]27[6555]]28"""
平均值、中值,累加,后減前
1a=np.arange(2,14).reshape((3,4)) 2print"a:",a 3print"average:",np.average(a)#平均值 4print"median:",np.median(a)#中值 5 6print"cumsum:",np.cumsum(a)#每個(gè)元素變成當(dāng)前元素+前面所有元素的和 7print"diff:",np.diff(a)#當(dāng)前元素減去前面元素的差 8""" 9a:[[2345]10[6789]11[10111213]]12average:7.513median:7.514cumsum:[259142027354454657790]15diff:[[111]16[111]17[111]]18"""
3.索引
最大值最小值索引,非零索引
1a=np.array([[2,6,0,4], 2[4,8,9,1], 3[10,2,3,11]]) 4print"argmin:",np.argmin(a) 5print"axis0:",np.argmin(a,axis=0) 6print"axis1:",np.argmin(a,axis=1) 7print"argmax:",np.argmax(a) 8print"zero:",np.nonzero(a) 910"""11argmin:212axis0:[0201]13axis1:[231]14argmax:1115zero:(array([0,0,0,1,1,1,1,2,2,2,2]),array([0,1,3,0,1,2,3,0,1,2,3]))16"""
argmin/argmax都是返回最小值/最大值的索引的函數(shù)。這里的axis和上面的分析是完全一致的,例如argmin(a)就是最小的索引,雖小的毋庸置疑是0,所以總體來講從第一行第一個(gè)元素到最后一行最后一個(gè)元素,總體來算索引,那就是第二個(gè)為0,所以返回2,如果axis=0說明一列中的每一行來比較,那第一列比較出來最小的為2,即索引為0,因?yàn)槊恳涣械拿恳恍衼肀容^所以最后的維度為列數(shù),在這里即為4,以此列推。非零索引的意思為非零的數(shù)返回索引,如上例為返回兩個(gè)array,前面array對應(yīng)行索引,后面對應(yīng)列索引,一前一后加一起的shape才對應(yīng)一個(gè)非零索引
取值,取列或行
1importnumpyasnp 2 3a=np.arange(3,15).reshape((3,4)) 4 5printa 6printa[1]#索引為1的行,同下 7printa[:][1]#索引為1的行,同上 8print"=========-------===========" 9printa[2][1]#和數(shù)組一樣的表示10printa[2,1]#同上,這才是比較標(biāo)準(zhǔn)的array的索引表示,前面是行后面是列的索引11print"=========---------============"12printa[:,1]#索引為1的列,生成為行向量13printa[:,1:2]#索引為1的列,生成為列向量14printa[:,1:3]1516printa[1,1:3]#為上面a[:,1:3]的索引為1的行向量17"""18[[3456]19[78910]20[11121314]]21[78910]22[78910]23=========-------===========2412251226=========---------============27[4812]28[[4]29[8]30[12]]31[[45]32[89]33[1213]]34[89]35"""
著重講一下a[:, 1:2]a[:, 1:3]a[1, 1:3]
a[:, 1:2]::代表行所有也就是一列要的話,這一列的每一行都要,1:2對應(yīng)的從索引為1的列來算移植相當(dāng)于取到索引為(2-1)的列,2為取的最高索引大一個(gè)。所以總體來講就是首先取每一行,之后在行里取索引1->1的列元素,所以為最終的結(jié)果列向量。
a[:, 1:3]:按照上面的分析則每一行都要,列要索引為1和(3-1)的元素,那就是索引為1和2的所有元素,也就是第二列和第三列的元素。
a[1, 1:3]:為a[:, 1:3]的索引為1的所有元素。這里需要注意的是
a[:, 1]#索引為1的列,生成為行向量,
a[:, 1:2]#索引為1的列,生成為列向量
因?yàn)閮煞N取值的思想不一樣,最終造成的結(jié)果也不一樣,一個(gè)是直接取,所以維度減少了一個(gè),另一個(gè)是在原本維度上截取,最終還是原來的維度。
迭代元素和降維
1a=np.arange(3,15).reshape((3,4))# 數(shù)據(jù)都是下取上差一個(gè)取到。 2printa 3print"row" 4forrowina:#取每一行迭代 5printrow 6print"column" 7forcolumnina.T:#每一列迭代 8printcolumn 9print"====================="10printa.flatten()#所有元素變成一維11b=np.array([[1,2,3]])12printb13printb.flatten()#降維1415foritemina.flat:#每個(gè)元素打印16printitem1718"""19[[3456]20[78910]21[11121314]]22row23[3456]24[78910]25[11121314]26column27[3711]28[4812]29[5913]30[61014]31=====================32[34567891011121314]33[[123]]34[123]3533643753863974084194210431144124513461447"""
行迭代,就是可以理解為最外層的維度進(jìn)行迭代,列迭代就是利用轉(zhuǎn)置來完成。flatten()函數(shù)的意思為把a(bǔ)rray的內(nèi)層的維度進(jìn)行降一維,將內(nèi)層的維度弄掉,則二維數(shù)據(jù)就成為一維數(shù)據(jù)了
4.合并與分開
兩個(gè)合并、多個(gè)合并(行向量轉(zhuǎn)換成列向量)
1#-*-coding:utf-8-*- 2importnumpyasnp 3 4a=np.array([1,1,2]) 5b=np.array([2,3,4]) 6 7c=np.vstack((a,b))#vertical 8 9print"a:",a10print"b:",b11print"c:",c12print"a,cshape:",a.shape,c.shape1314d=np.hstack((a,b))#horizontal15print"d:",d16printd.shape17"""18a:[112]19b:[234]20c:[[112]21[234]]22a,cshape:(3,)(2,3)23d:[112234]24(6,)25"""26printa.T#nottransponse行向量無法直接用轉(zhuǎn)置來變成列向量27#行向量變成列向量28printa[np.newaxis,:].shape29printa[:,np.newaxis].shape30printa[:,np.newaxis]#轉(zhuǎn)換方法31"""32[112]33(1,3)34(3,1)35[[1]36[1]37[2]]38"""39a=np.array([1,1,2])[:,np.newaxis]40b=np.array([2,3,4])[:,np.newaxis]4142c=np.concatenate((a,b,b),axis=0)#多向量融合4344printc4546c=np.concatenate((a,b,b),axis=1)#多向量融合4748printc4950"""51[[1]52[1]53[2]54[2]55[3]56[4]57[2]58[3]59[4]]60[[122]61[133]62[244]]63"""
分開
1#-*-coding:utf-8-*- 2importnumpyasnp 3 4a=np.arange(12).reshape((3,4)) 5 6printa 7print"平等分開" 8print"vertical:",np.split(a,2,axis=1)# 910print"horizontal:",np.split(a,3,axis=0)#11"""12[[0123]13[4567]14[891011]]15平等分開16vertical:[array([[0,1],17[4,5],18[8,9]]),array([[2,3],19[6,7],20[10,11]])]21horizontal:[array([[0,1,2,3]]),array([[4,5,6,7]]),array([[8,9,10,11]])]22"""23print"不平等分開"24printnp.array_split(a,3,axis=1)2526print"代替需要axis參數(shù)"27print"vertical_a:",np.vsplit(a,3)2829print"horizontal_a:",np.hsplit(a,2)30"""31不平等分開32[array([[0,1],33[4,5],34[8,9]]),array([[2],35[6],36[10]]),array([[3],37[7],38[11]])]39代替需要axis參數(shù)40vertical_a:[array([[0,1,2,3]]),array([[4,5,6,7]]),array([[8,9,10,11]])]41horizontal_a:[array([[0,1],42[4,5],43[8,9]]),array([[2,3],44[6,7],45[10,11]])]46"""
5.元素傳遞和copy
1b=np.arange(4) 2 3printb 4c=b 5e=c 6d=e 7b[0]=11 8printb 910printcisb11printdisb12printb[0]1314d[1:3]=[22,22]15printb16printc1718c=b.copy()1920b[3]=442122printb23printc24printe25"""26[0123]27[11123]28True29True301131[1122223]32[1122223]33[11222244]34[1122223]35[11222244]36"""
array這個(gè)元素傳遞有點(diǎn)意思的,就是如果直接a=b,其實(shí)從內(nèi)存角度來考慮就相當(dāng)于a和b指向了一樣的元素內(nèi)存空間,所以改變一個(gè)元素的值,另一個(gè)一樣改變,如果想各是各的,并且還想傳遞另一個(gè)元素的值那就用a=b.copy(),所以這個(gè)還是需要注意的
-
機(jī)器
+關(guān)注
關(guān)注
0文章
784瀏覽量
40774
原文標(biāo)題:【Data Mining】機(jī)器學(xué)習(xí)三劍客之Numpy常用用法總結(jié)
文章出處:【微信號:TheBigData1024,微信公眾號:人工智能與大數(shù)據(jù)技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論