1. 程式人生 > 其它 >import numpy as np_【Data Mining】機器學習三劍客之Numpy常用用法總結

import numpy as np_【Data Mining】機器學習三劍客之Numpy常用用法總結

技術標籤:import numpy as np

點選“小詹學Python”,選擇“置頂”公眾號

重磅乾貨,第一時間送達f4764763dba8501ce9df9fb02abb277e.png

本文轉載自AI蝸牛車,禁二次轉載

一、前言

玩資料分析、資料探勘、AI的都知道這個python庫用的是很多的,裡面包含各種操作,在實際的dataset的處理當中是非常常用的,這裡我做一個總結,方便自己看,也方便大家看,我準備做一個非常細緻的分類,每個分類有對應的numpy常用用法,以後見到或者用到再一個個慢慢加進來,如果我還用csdn我就會移植update下去。

二、下載、安裝、匯入

用anaconda安裝是十分方便的,如果你已經安裝了tf,keras之類的,其實已經直接把numpy安裝了,一般來說安裝就是pip命令。

1pipinstallnumpy#py2
2pip3installnumpy#py3

用法則是

1importnumpyasnp #一般as為np來操作

三、常用用法總結

1.array基本資訊以及生成各種常見array基本操作 

生成array,得到對應的基本資訊

 1importnumpyasnp
2
3array=np.array([[1,2,3],
4[2,3,4]])
5
6printarray#numpy生成的array
7printarray.dtype #每個元素的型別
8print"numberofdim",array.ndim #array的維度
9print'shape:',array.shape #形狀, 兩行三列。
10print'size:',array.size#array的大小=array中所有元素的個數
11"""12[[123]13[234]]14int6415numberofdim216shape:(2,3)17size:618"""

array的生成就是np.array(list),本質上是把定義的list轉換成array,因為array可以進行更加方便地計算和操作,比如矩陣的轉置和相乘。

array的dtype設定

 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.dtype
11aaaaa=np.array([2,23,4],dtype=np.int64)
12print"aaaaa'sdtype:",aaaaa.dtype
13
14"""15a'sdtypefloat3216aa'sdtypeint6417aaa'sdtypeint6418aaaa'sdtypefloat6419aaaaa'sdtype:int6420"""

由可以得到一個結論就是如果定義的array裡面的list的元素本身為整數的話,不設定type,則預設為int64,如果設定為int型別而沒有設定位元組大小則還是預設為int64,如果元素本身為小數,則預設為float64。
所以如果用int64,則如果元素都為整數則不需要設定預設即可,設定其他型別需要設定,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的array
10
11printa2
12"""13[[1111]14[1111]15[1111]]16"""

這裡注意shape=(a,b),在填入shape的引數的時候一定要加括號,以下雷同。

 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)  #生成array 10到20 每隔2的一增加,for迴圈中主要使用
9printa4
10"""11[1012141618]12"""
13
14a5=np.arange(12)#生成array 0到12-1=11 每一個增加,for迴圈中非常常用
15printa5
16"""17[01234567891011]18"""
19
20a6=np.arange(12).reshape((3,4))#這裡主要展示reshape的功能,能夠重新定義矩陣的形狀
21printa6
22"""23[[0123]24[4567]25[891011]]26"""
27 # 1和10之間4個元素越過,這個主要應用在插值運算或者matplotlib畫光滑曲線的時候計算用到。
28a7=np.linspace(1,10,4).reshape((2,2)) 
29
30printa7
31"""32[[1.4.]33[7.10.]]3435"""

2.array之間的計算

加減法

相同維度:

 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-b
10print"c1:",c1
11"""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
9
10"""11aa:[[1234]12[11223344]]13bb:[0123]14a+b:[[1357]15[11233547]]16"""

如果是不同維度的array進行加減法的話,程式就是把維度低的array自動複製擴充套件到大維度的array,進行相加 當然前提條件是兩個不同維度的array進行相加的時候,低維度的array的shape也要和高維度的array其中一個shape相同,例如上面程式碼所示,(2,4) (1,4) 都有個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#對應元素相乘
8print"d/e",d/e#對應元素相除,因為是int64型別所以類似於2/3=0
9"""10d:[[12]11[34]]12e:[[13]13[57]]14d*e:[[16]15[1528]]16d/e[[10]17[00]]18"""

不同緯度的乘除法和上面加減法解析情況一樣,可對比來看。

平方,三角函式,比較元素大小

 1a=np.array([10,20,30,40])
2b=np.arange(4)
3c2=b**2#平方
4print"c2:",c2
5
6c3=10*np.sin(a)# sin函式
7print"c3:",c3
8""" 9c2:[0149]10c3:[-5.440211119.12945251-9.880316247.4511316]11"""
12print"b:",b
13print"b:",b3# b中小於3的都為TRUE
14print"b:",b==3#b中等於3的為TRUE
15"""16b:[0123]17b:[TrueTrueTrueFalse]18b:[FalseFalseFalseTrue]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進行矩陣相乘

隨機數和max,min,sum

 1f=np.random.random((2,4))#隨機產生shape為(2,4)的一個array,每個元素都為0-1之間隨機生成
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為最大,如果不設定axis維度引數的話,則都為整個array的元素來說,但一般我們運用都只是算某個維度的sum,max,min,在二維資料中,axis=0代表行,第一個維度,axis=1,代表列為第二個維度,其實這麼記並不是很好很有可能記錯,我一般都是這麼記得:axis=0為行,那意思就是每一行都要算唄?算完那不就是一列的每一行算個數被,axis=1類推,多維資料類推即可

矩陣轉置和排序,以及元素比較大小重置元素方法

 1c=np.arange(14,2,-1).reshape((3,4))
2
3printc
4print"sort:",np.sort(c)#每一行進行重新大小排序當然也有axis引數配置,根據我的axis引數說明來操作
5
6printnp.transpose(c)#轉置 同下面操作
7printc.T# 轉置 同上面操作
8
9print"clip:",np.clip(c,5,9)#c矩陣中的元素小於5的等於5,大於9的等於9
10"""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)#每個元素變成當前元素+前面所有元素的和
7print"diff:",np.diff(a) #當前元素減去前面元素的差
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)
9
10"""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都是返回最小值/最大值的索引的函式。 這裡的axis和上面的分析是完全一致的,例如argmin(a)就是最小的索引,雖小的毋庸置疑是0,所以總體來講從第一行第一個元素到最後一行最後一個元素,總體來算索引,那就是第二個為0,所以返回2,如果axis=0說明一列中的每一行來比較,那第一列比較出來最小的為2,即索引為0,因為每一列的每一行來比較所以最後的維度為列數,在這裡即為4,以此列推。非零索引的意思為非零的數返回索引,如上例為返回兩個array,前面array對應行索引,後面對應列索引,一前一後加一起的shape才對應一個非零索引

取值,取列或行

 1importnumpyasnp
2
3a=np.arange(3,15).reshape((3,4))
4
5printa
6printa[1] #索引為1的行,同下
7printa[:][1] #索引為1的行,同上
8print"=========-------==========="
9printa[2][1]#和陣列一樣的表示
10printa[2,1] #同上,這才是比較標準的array的索引表示,前面是行後面是列的索引
11print"=========---------============"
12printa[:,1]  #索引為1的列,生成為行向量
13printa[:,1:2]  #索引為1的列,生成為列向量
14printa[:,1:3]  
15
16printa[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對應的從索引為1的列來算移植相當於取到索引為(2-1)的列,2為取的最高索引大一個。所以總體來講就是首先取每一行,之後在行裡取索引1->1的列元素,所以為最終的結果列向量。

a[:, 1:3]:按照上面的分析則每一行都要,列要索引為1和(3-1)的元素,那就是索引為1和2的所有元素,也就是第二列和第三列的元素。

a[1, 1:3]:為a[:, 1:3]的索引為1的所有元素。這裡需要注意的是

a[:, 1]  #索引為1的列,生成為行向量,

a[:, 1:2] #索引為1的列,生成為列向量

因為兩種取值的思想不一樣,最終造成的結果也不一樣,一個是直接取,所以維度減少了一個,另一個是在原本維度上擷取,最終還是原來的維度。

迭代元素和降維

 1a=np.arange(3,15).reshape((3,4))# 資料都是下取上差一個取到。
2printa
3print"row"
4forrowina: #取每一行迭代
5printrow
6print"column"
7forcolumnina.T: #每一列迭代
8printcolumn
9print"====================="
10printa.flatten()#所有元素變成一維
11b=np.array([[1,2,3]]) 
12printb
13printb.flatten()#降維
14
15foritemina.flat: #每個元素列印
16printitem
17
18"""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"""

行迭代,就是可以理解為最外層的維度進行迭代,列迭代就是利用轉置來完成。flatten()函式的意思為把array的內層的維度進行降一維,將內層的維度弄掉,則二維資料就成為一維資料了

4.合併與分開

兩個合併、多個合併(行向量轉換成列向量)

 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:",a
10print"b:",b
11print"c:",c
12print"a,cshape:",a.shape,c.shape
13
14d=np.hstack((a,b))#horizontal
15print"d:",d
16printd.shape
17"""18a:[112]19b:[234]20c:[[112]21[234]]22a,cshape:(3,)(2,3)23d:[112234]24(6,)25"""
26printa.T#nottransponse 行向量無法直接用轉置來變成列向量
27#行向量變成列向量
28printa[np.newaxis,:].shape
29printa[:,np.newaxis].shape
30printa[:,np.newaxis]#轉換方法
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]
41
42c=np.concatenate((a,b,b),axis=0)#多向量融合
43
44printc
45
46c=np.concatenate((a,b,b),axis=1)#多向量融合
47
48printc
49
50"""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)#
9
10print"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)
25
26print"代替需要axis引數"
27print"vertical_a:",np.vsplit(a,3)
28
29print"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引數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
9
10printcisb
11printdisb
12printb[0]
13
14d[1:3]=[22,22]
15printb
16printc
17
18c=b.copy()
19
20b[3]=44
21
22printb
23printc
24printe
25"""26[0123]27[11123]28True29True301131[1122223]32[1122223]33[11222244]34[1122223]35[11222244]36"""

array這個元素傳遞有點意思的,就是如果直接a=b,其實從記憶體角度來考慮就相當於a和b指向了一樣的元素記憶體空間,所以改變一個元素的值,另一個一樣改變,如果想各是各的,並且還想傳遞另一個元素的值那就用a=b.copy(),所以這個還是需要注意的

6.補充部分

array.min/max/ptp

 1importnumpyasnp
2
3a=[[2,4,8,9],[1,7,4,5],[5,7,1,4]]
4a=np.array(a)
5print(a)
6print(a.min(0))
7print(a.min(1))
8print(a.ptp(0))
9"""10[[2489]11[1745]12[5714]]13axis=0為每列的最小值返回14[1414]15axis=1為每行的最小值返回16[211]17ptp為最大值減最小值的range18[4375]19"""

np.random.choice

1importnumpyasnp
2
3a=np.random.choice(a=100,size=20)
4print(a)
5"""60-99之間選size為20的隨機數的list7[78829196560287924565345848965777238069]8"""

推薦閱讀:

《復仇者聯盟》AI換臉系列,當了英雄的我現在很慌...