官术网_书友最值得收藏!

1.3 NumPy數(shù)組常用函數(shù)

下面以學(xué)生的學(xué)習(xí)成績(jī)?yōu)閿?shù)據(jù)樣本展開(kāi)練習(xí),介紹NumPy數(shù)組常用函數(shù)。

通過(guò)隨機(jī)函數(shù)生成一個(gè)班50名同學(xué)的語(yǔ)文、數(shù)學(xué)、化學(xué)、物理和外語(yǔ)5門(mén)課的相應(yīng)成績(jī),假設(shè)每個(gè)同學(xué)的成績(jī)范圍為46~100。


>>>import numpy as np
>>>score=np.random.randint(46,100,(50,5))

1.3.1 統(tǒng)計(jì)函數(shù)

1.計(jì)算數(shù)組/矩陣中的最大值和最小值

np.amax(np數(shù)組[,[axis=]0])用于計(jì)算數(shù)組中的元素沿指定軸的最大值;np.amin(np數(shù)組[,[axis=]0]) 用于計(jì)算數(shù)組中的元素沿指定軸的最小值。

二維數(shù)據(jù)對(duì)象的大多數(shù)方法都會(huì)有axis這個(gè)參數(shù),它控制了用戶(hù)指定的操作是沿著0軸還是1軸進(jìn)行。一般而言,axis=0代表對(duì)列進(jìn)行操作,axis=1代表對(duì)行進(jìn)行操作,省略該項(xiàng)則默認(rèn)找到整個(gè)數(shù)組的最大值、最小值。

【動(dòng)動(dòng)手練習(xí)1-6】 計(jì)算數(shù)組/矩陣中的最大值、最小值


>>>np.amax(score)    #產(chǎn)生一個(gè)單一的值
99 
>>>np.amin(score) 
46 
#或 
>>>score.max() 
>>>score.min()

分別計(jì)算語(yǔ)文、數(shù)學(xué)、化學(xué)、物理和外語(yǔ)的最高成績(jī)和最低成績(jī)。


>>> np.amax(score,axis=0)    #生成一個(gè)數(shù)組;np.amax()方法與np.max()方法相同
array([98, 99, 99, 97, 99])  #對(duì)應(yīng)語(yǔ)文、數(shù)學(xué)、化學(xué)、物理和外語(yǔ)的最高成績(jī) 
>>> np.amin(score,0)         #可自行驗(yàn)證np.amin()方法與np.min()方法相同 
array([46, 47, 46, 48, 47])  #對(duì)應(yīng)語(yǔ)文、數(shù)學(xué)、化學(xué)、物理和外語(yǔ)的最低成績(jī)

查看總成績(jī)排在前三的同學(xué)的各門(mén)課程最高、最低成績(jī)。


>>> np.max(score,axis=1)[:3]  #np.amax()和np.max()是同一個(gè)方法,可混用
array([96, 97, 97]) 
>>> np.min(score,axis=1)[:3]  #np.amin()和np.min()是同一個(gè)方法,可混用 
array([68, 53, 55])

再總結(jié)一下,np.amax(score)是求出整個(gè)數(shù)組中的最大值。np.amax(score,0)是沿著axis=0軸(按列)比較的最大值。np.amax(score,1)是沿著axis=1軸(按行)比較的最大值。

2.統(tǒng)計(jì)最大值與最小值之差

np.ptp()即極差函數(shù),極差是一組數(shù)據(jù)的最大值與最小值之差。

將成績(jī)差值進(jìn)行分析,可以發(fā)現(xiàn)班級(jí)中同學(xué)總的學(xué)習(xí)差距、各門(mén)課程的差距,以及各位同學(xué)的偏科程度。

【動(dòng)動(dòng)手練習(xí)1-7】 使用極差函數(shù)


>>> np.ptp(score)          #求出所有成績(jī)的最高值與最低值的差
53 
>>> np.ptp(score,axis=0)   #求出各門(mén)課程的最高成績(jī)與最低成績(jī)的差 
Out[49]: array([52, 52, 53, 49, 52]) 
>>> np.ptp(score,axis=1)   #求出每位同學(xué)各門(mén)課程最高成績(jī)與最低成績(jī)的差

3.統(tǒng)計(jì)數(shù)組的分位數(shù)(百分位數(shù))

np.percentile()函數(shù)的作用是求百分位數(shù),從而能夠讓用戶(hù)知道數(shù)字大致的分布。

np.percentile()函數(shù)原型:np.percentile(a, q, axis=None)。

各參數(shù)說(shuō)明如下。

● a:原始數(shù)組,可以是多維數(shù)組。

● q:要計(jì)算的百分位數(shù),取值范圍為0~100,多個(gè)值時(shí)要使用列表方式。

● axis:在a的軸上計(jì)算百分位數(shù)。

查看學(xué)生整體成績(jī)的分布情況,從最低成績(jī)(0%),處于10%、25%、50%、75%位置上的成績(jī),最高成績(jī)(100%)查詢(xún),即批量查詢(xún)。

【動(dòng)動(dòng)手練習(xí)1-8】 使用分位數(shù)函數(shù)


>>>np.percentile(score,[0,10,25,50,75,100])
array([46. , 51.9, 60. , 75.5, 87. , 99. ])

查看每門(mén)課程的成績(jī)分布情況。


>>> n=np.percentile(score,[0,10,25,50,75,100],axis=0)
>>> n 
array([[46.  , 47.  , 46.  , 48.  , 47.  ], 
       [49.8 , 50.9 , 50.7 , 52.9 , 55.8 ], 
       [56.  , 65.  , 60.25, 61.25, 61.5 ], 
       [70.5 , 80.5 , 73.  , 71.  , 80.  ], 
       [87.75, 89.  , 79.5 , 86.  , 86.75], 
       [98.  , 99.  , 99.  , 97.  , 99.  ]])

可以發(fā)現(xiàn),數(shù)組的列是每門(mén)課程的成績(jī)分布數(shù)據(jù),列出的是處于不同百分?jǐn)?shù)位置上的成績(jī),實(shí)際上,處于50%位置上的數(shù)據(jù)就是相應(yīng)的中位數(shù),不是平均數(shù)。

可以通過(guò)T轉(zhuǎn)置,將列轉(zhuǎn)換為行的形式展示(原來(lái)的行自然就轉(zhuǎn)為列)。


>>> n.T  #每一行分別對(duì)應(yīng)語(yǔ)文、數(shù)學(xué)、化學(xué)、物理和外語(yǔ)的成績(jī)情況

4.統(tǒng)計(jì)數(shù)組中的中位數(shù)

中位數(shù)又稱(chēng)中值,是統(tǒng)計(jì)學(xué)中的專(zhuān)有名詞,代表一個(gè)樣本、種群或概率分布中的數(shù)值,是把所有觀察值(數(shù)組)按從高到低排序后找出的正中間的數(shù)。如果數(shù)組數(shù)據(jù)的個(gè)數(shù)是奇數(shù),則中間那個(gè)數(shù)就是這組數(shù)據(jù)的中位數(shù);如果數(shù)據(jù)的個(gè)數(shù)是偶數(shù),則中間2個(gè)數(shù)的算術(shù)平均值就是這組數(shù)據(jù)的中位數(shù)。

下面使用np.median()函數(shù)分別查找所有課程成績(jī)的中位數(shù)、每門(mén)課程的中位數(shù)和每一位同學(xué)成績(jī)的中位數(shù)。

【動(dòng)動(dòng)手練習(xí)1-9】 使用中位數(shù)函數(shù)


>>>np.median(score)
75.5 
>>>np.percentile(score,50) 
75.5 
>>>np.median(score,axis=0) 
array([70.5, 80.5, 73. , 71. , 80. ]) 
>>> np.median(score,axis=1)[:3]   #僅顯示總成績(jī)排在前三的同學(xué)成績(jī)的中位數(shù) 
array([72., 65., 83.])

有時(shí)候,中位數(shù)可能比平均值更有說(shuō)服力,比如,全社會(huì)的工資中位數(shù)比平均工資更能體現(xiàn)全社會(huì)大多數(shù)人的收入水平。

5.統(tǒng)計(jì)數(shù)組中的平均數(shù)、加權(quán)平均值

在NumPy中,np.mean()函數(shù)和np.average()函數(shù)都有取平均數(shù)的意思,在不考慮加權(quán)平均的前提下,兩者的輸出是一樣的。

求所有成績(jī)的平均值、各門(mén)課程的平均值。

【動(dòng)動(dòng)手練習(xí)1-10】 使用均值函數(shù)


>>>np.mean(score)
73.676 
>>>np.average(score) 
73.676 
>>>np.mean(score,axis=0)        #求各列的平均值 
array([72.12, 76.16, 71.52, 73.12, 75.46]) 
>>>np.mean(score,axis=1)[-3:]   #axis=1時(shí),則求每位學(xué)生的平均成績(jī) 
array([70.2, 78.6, 77.4])

當(dāng)每門(mén)課程權(quán)重不一樣時(shí),可以通過(guò)np.average()函數(shù)計(jì)算加權(quán)平均值,求出每一位學(xué)生成績(jī)的加權(quán)平均值和全部成績(jī)的加權(quán)平均值。

np.average()函數(shù)根據(jù)在另一個(gè)數(shù)組中給出的各自的權(quán)重,計(jì)算數(shù)組中元素的加權(quán)平均值。該函數(shù)可以接收一個(gè)軸參數(shù)。如果沒(méi)有指定軸參數(shù),則數(shù)組會(huì)被展開(kāi)。

加權(quán)平均值即將各數(shù)值乘以相應(yīng)的權(quán)數(shù),然后相加求和得到總體值,再除以總的單位數(shù)。


>>>w=np.array([120,120,100,100,120])   #定義語(yǔ)文、數(shù)學(xué)、化學(xué)、物理和外語(yǔ)的成績(jī)對(duì)應(yīng)
重 
>>>np.average(score, weights=w, axis=1)[:3]    #顯示成績(jī)排在前三的值 
array([79.        , 70.10714286, 78.17857143]) #"79."后面的空表示未顯示部分 
>>>np.average(score, weights=w, axis=1).mean() 
73.77285714285715

6.統(tǒng)計(jì)數(shù)組中的方差和標(biāo)準(zhǔn)差

方差是概率論中最基礎(chǔ)的概念之一,是由統(tǒng)計(jì)學(xué)天才羅納德·費(fèi)雪提出的。方差用于衡量數(shù)據(jù)離散程度,因?yàn)樗荏w現(xiàn)變量與其數(shù)學(xué)期望(均值)之間的偏離程度。

【例題1-2】 計(jì)算方差

計(jì)算方差,是指先求一組數(shù)據(jù)中各個(gè)數(shù)減去這組數(shù)據(jù)平均數(shù)的平方和,再對(duì)平方和求平均數(shù)。如求(1, 2, 3, 4, 5)這組數(shù)據(jù)的方差,就要先求出這組數(shù)據(jù)的平均數(shù)(1+2+3+4+5)÷5=3,再求各個(gè)數(shù)與平均數(shù)的差的平方和,(1?3)2+(2?3)2+(3?3)2+(4?3)2+(5?3)2=10,最后求平方和的平均數(shù)10÷5=2,即這組數(shù)據(jù)的方差為2。

標(biāo)準(zhǔn)差是方差的算術(shù)平方根(開(kāi)根號(hào))。由于方差是數(shù)據(jù)的平方,與檢測(cè)值本身相差太大,人們難以直觀衡量,所以常用方差開(kāi)根號(hào)來(lái)衡量。標(biāo)準(zhǔn)差的公式:std=sqrt(mean((x - x.mean())**2))。

標(biāo)準(zhǔn)差和方差一樣反映了一個(gè)數(shù)據(jù)集的離散程度,但平均數(shù)相同,標(biāo)準(zhǔn)差未必相同。

【例題1-3】 計(jì)算標(biāo)準(zhǔn)差

A、B兩組各有6名學(xué)生參加同一次語(yǔ)文測(cè)驗(yàn),A組的分?jǐn)?shù)為95、85、75、65、55、45,B組的分?jǐn)?shù)為73、72、71、69、68、67。這兩組分?jǐn)?shù)的平均數(shù)都是70,但A組的標(biāo)準(zhǔn)差為17.08,B組的標(biāo)準(zhǔn)差為2.16,說(shuō)明A組學(xué)生成績(jī)之間的差距比B組學(xué)生成績(jī)之間的差距大得多。

下面通過(guò)NumPy提供的方差、標(biāo)準(zhǔn)差函數(shù)查看學(xué)生成績(jī)的離散程度。

【動(dòng)動(dòng)手練習(xí)1-11】 計(jì)算方差和標(biāo)準(zhǔn)差

使用NumPy計(jì)算標(biāo)準(zhǔn)差和方差的方法如下。

(1)np.std(a, axis = None):計(jì)算標(biāo)準(zhǔn)差。

(2)np.var(a, axis = None):計(jì)算方差。


>>>np.var(score)        #未指定軸,計(jì)算全部成績(jī)的方差
 241.891024 
>>>np.std(score)        #未指定軸,計(jì)算全部成績(jī)的標(biāo)準(zhǔn)差 
15.55284617039595       #只有一個(gè)標(biāo)準(zhǔn)差并不能確定其離散程度的高低 
>>>np.std(score,axis=0) #按列計(jì)算每門(mén)課程成績(jī)的標(biāo)準(zhǔn)差 
 array([16.97603016, 16.16955163, 14.43224168, 14.96882093, 14.51648718])  
#計(jì)算語(yǔ)文、數(shù)學(xué)、化學(xué)、物理和外語(yǔ)的標(biāo)準(zhǔn)差,可以相互比較各科成績(jī)的差距 
#計(jì)算每一位學(xué)生各科成績(jī)的離散程度(差距) 
>>>np.std(score,axis=1)[4:7]  #顯示其中的3個(gè)標(biāo)準(zhǔn)差 
 array([17.14176187,  1.74355958, 14.81890684])  #數(shù)值大代表偏科嚴(yán)重

7.求和:一般求和與按軸累積求和

【動(dòng)動(dòng)手練習(xí)1-12】 sum()求和


>>>np.sum(score)           #未指定軸,計(jì)算所有成績(jī)的和
18419 
>>>np.sum(score, axis=0)   #每門(mén)課程的成績(jī)和(按列) 
array([3606, 3808, 3576, 3656, 3773]) 
>>>np.sum(score, axis=1)[:3]    #排在前三的學(xué)生的成績(jī)和(按行) 
array([392, 349, 385])

np.cumsum(score[,axis=0])是按軸累積求和,未指定軸則對(duì)所有元素累積求和。axis=0表示對(duì)多維數(shù)組按列累積求和,axis=1表示對(duì)數(shù)組按行累積求和。


>>>np.cumsum(score)[245:]     #對(duì)所有成績(jī)累積求和,顯示最后5個(gè),共有50*5個(gè)
array([18120, 18167, 18229, 18326, 18419], dtype=int32) 
>>>np.cumsum(score,axis=0)[:3]    #按列對(duì)每門(mén)課程成績(jī)累積求和,顯示前3行 
array([[ 69,  96,  72,  68,  87], 
       [166, 161, 150, 121, 143], 
       [249, 258, 216, 176, 227]], dtype=int32)

讀者可以自行試驗(yàn)對(duì)行成績(jī)(每個(gè)同學(xué)的成績(jī))累積求和。

1.3.2 邏輯函數(shù)

1.np.any()函數(shù)和np.all()函數(shù)

【例題1-4】 使用np.any()函數(shù)和np.all()函數(shù)


>>>a1=score[0]
>>>a2=score[1] 
>>> print('第一行大于第二行:',a1>a2) 
第一行大于第二行: [False  True False  True  True] 
>>> print('第一行只要有大于第二行的元素:',np.any(a1>a2)) 
第一行只要有大于第二行的元素: True 
>>> print('第一行的元素全部都大于第二行的元素:',np.all(a1>a2)) 
第一行的元素全部都大于第二行的元素: False

使用np.any()函數(shù)時(shí),只要結(jié)果中存在一個(gè)True,最后結(jié)果就為T(mén)rue。而使用np.all()函數(shù)時(shí),只有結(jié)果中全為T(mén)rue,最后的結(jié)果才為T(mén)rue。

2.NumPy中的邏輯運(yùn)算函數(shù)

Python中有and、or、not三個(gè)邏輯運(yùn)算符,NumPy使用np.logical_and()、np.logical_or()、np.logical_not()三個(gè)函數(shù)來(lái)進(jìn)行邏輯運(yùn)算。

【動(dòng)動(dòng)手練習(xí)1-13】 數(shù)組邏輯運(yùn)算綜合練習(xí)

將第一位同學(xué)的各門(mén)課程成績(jī)與其后的3位同學(xué)進(jìn)行比較,獲取其成績(jī)均高于其他3位同學(xué)的課程名稱(chēng)。


>>>a3=score[0]>score[1]
>>>a4=score[0]>score[2] 
>>>a5=score[0]>score[3] 
>>>np.logical_and(a3,a4,a5)  #與a3&a4&a5等價(jià) 
array([False, False, False,  True,  True])  #對(duì)應(yīng)語(yǔ)文、數(shù)學(xué)、化學(xué)、物理和外語(yǔ)成績(jī);物理與外語(yǔ)的成績(jī)高于其他3位同學(xué)的相應(yīng)成績(jī) 
>>>score[0][a3&a4&a5]  #查看高于其他3位同學(xué)的物理與外語(yǔ)成績(jī) 
array([68, 87]) 

np.logical_and()函數(shù)的參數(shù)必須是2個(gè)及以上,可以是多個(gè)布爾表達(dá)式列表數(shù)組。

查看前3位同學(xué)每門(mén)課程成績(jī)有沒(méi)有大于90分的。


>>>np.logical_or(score[0]>90,score[1]>90,score[2]>90)
 #等價(jià)于(score[0]>90) | (score[1]>90) | (score[2]>90),布爾表達(dá)式要有括號(hào) 
array([ True,  True, False, False, False])  #可以判斷語(yǔ)文、數(shù)學(xué)成績(jī)有大于90分的

np.logical_or()函數(shù)的參數(shù)是2個(gè)及以上。

查看某同學(xué)的成績(jī)不在70~80分的課程。


>>>np.logical_not(score[0]>=70, score[0]<80)
array([ True, False, False, True, False]) 

np.logical_not()函數(shù)的參數(shù)是1個(gè)及以上。

3.NumPy的np.where()函數(shù)

np.where()函數(shù)其實(shí)是一個(gè)三元運(yùn)算符。函數(shù)滿(mǎn)足條件返回一個(gè)值,反之返回另一個(gè)值。

【動(dòng)動(dòng)手練習(xí)1-14】 數(shù)組條件運(yùn)算

判斷前4位同學(xué)的前4門(mén)課程是否及格,成績(jī)大于60(及格)置為1,否則(不及格)置為0。


>>>temp = score[:4, :4]
>>>np.where(temp > 60, 1, 0) 
array([[1, 1, 1, 1], 
       [1, 1, 1, 0], 
       [1, 1, 1, 0], 
       [0, 1, 0, 1]])

復(fù)合邏輯運(yùn)算則需要結(jié)合np.logical_and()函數(shù)和np.logical_or()函數(shù)使用,例如判斷前4名學(xué)生的前4門(mén)課程的成績(jī),成績(jī)大于60且小于90置為1,否則置為0。


>>>np.where(np.logical_and(temp > 60, temp < 90), 1, 0)
array([[1, 0, 1, 1], 
       [0, 1, 1, 0], 
       [1, 0, 1, 0], 
       [0, 1, 0, 1]])

1.3.3 離散差分函數(shù)和梯度函數(shù)

1.離散差分(差值)函數(shù)np.diff()

np.diff()函數(shù)的原型:np.diff(a, n=1,axis=1),其作用是求矩陣數(shù)組中后一個(gè)元素減去前一個(gè)元素的差值。各個(gè)參數(shù)的說(shuō)明如下。

● a:輸入的矩陣數(shù)組。

● n:可選,代表要執(zhí)行幾次差值運(yùn)算。默認(rèn)是1。

● axis:默認(rèn)axis=1,表示按列相減(后一列減前一列);axis=0時(shí)表示按行相減(后一行減前一行)。如此,每執(zhí)行一次差值運(yùn)算就比原有的列或行少一列或一行。

【例題1-5】 求差分


>>>import numpy as np
>>>score=np.random.randint(46,100,(50,5)) 
>>>a=score[4:8,:]   #取一個(gè)4行5列的矩陣數(shù)組 
>>> a 
array([[97, 98, 78, 77, 95], 
       [64, 70, 90, 98, 54], 
       [99, 88, 68, 81, 91], 
       [58, 59, 96, 91, 58]]) 
>>>np.diff(a)    #按列相減,進(jìn)行一次差值運(yùn)算 
array([[  1, -20,  -1,  18],    #跨列相減,結(jié)果為4行4列(比原來(lái)少一列) 
       [  6,  20,   8, -44], 
       [-11, -20,  13,  10], 
       [  1,  37,  -5, -33]]) 
>>>np.diff(a,axis=0)    #按行相減,進(jìn)行一次差值運(yùn)算 
array([[-33, -28,  12,  21, -41],    #跨行相減,結(jié)果為3行5列(比原來(lái)少一行) 
       [ 35,  18, -22, -17,  37], 
       [-41, -29,  28,  10, -33]]) 
>>>np.diff(a,n=2,axis=0)  #按行相減,進(jìn)行2次差值運(yùn)算,就是對(duì)上一個(gè)結(jié)果再進(jìn)行差值運(yùn)算 
array([[ 68,  46, -34, -38,  78],  #結(jié)果為2行5列(比原來(lái)少2行) 
       [-76, -47,  50,  27, -70]])

定義的參數(shù)n大于1時(shí),表示將進(jìn)行多次差值運(yùn)算,就是在上一次差值運(yùn)算的矩陣基礎(chǔ)上再進(jìn)行差值運(yùn)算,直到n次為止。讀者可以自行完成多次行差值操作。

2.梯度函數(shù)np.gradient()

np.gradient(f):用于計(jì)算數(shù)組f中元素的梯度,當(dāng)f為多維時(shí),返回每個(gè)維度的梯度。返回的結(jié)果和原始數(shù)組大小相同。

梯度的計(jì)算過(guò)程:對(duì)于一維的數(shù)組,兩個(gè)邊界的元素直接用后一個(gè)值減去前一個(gè)值,得到梯度,即b?a;對(duì)于中間的元素,取相鄰兩個(gè)元素差的一半,即(c?a)/2。

【例題1-6】 求梯度


>>>score[0]    #得到一個(gè)一維數(shù)組
array([69, 96, 72, 68, 87]) 
>>>np.gradient(score[0]) 
array([ 27. ,  1.5,  -14. ,  7.5,  19. ])

對(duì)于二維數(shù)組:分別計(jì)算2個(gè)維度上的梯度,每個(gè)維度上的梯度和上面的一維數(shù)組梯度求法相同。對(duì)于二維數(shù)組,任意一個(gè)元素的梯度存在兩個(gè)方向,所以求得的梯度為兩個(gè)數(shù)組對(duì)象,第一個(gè)數(shù)組表示最外層維度的梯度值,第二個(gè)數(shù)組表示第二層維度的梯度值。即二維數(shù)組求梯度值的結(jié)果是包含兩個(gè)ndarray數(shù)組的列表,第一個(gè)列表是按列(維度)求梯度獲得,第二個(gè)列表是按行(維度)求梯度獲得。不論按列還是按行求梯度,其方法與一維求梯度一致。


>>>score[:4,:4]
array([[69, 96, 72, 68], 
       [97, 65, 78, 53], 
       [83, 97, 66, 55], 
       [55, 81, 58, 80]]) 
>>>np.gradient(score[:4,:4])            #返回一個(gè)列表,列表中有兩個(gè)數(shù)組 
[array([[ 28. , -31. ,   6. , -15. ],   #按列求梯度獲得的數(shù)組 
        [  7. ,   0.5,  -3. ,  -6.5], 
        [-21. ,   8. , -10. ,  13.5], 
        [-28. , -16. ,  -8. ,  25. ]]), 
 array([[ 27. ,   1.5, -14. ,  -4. ],   #按行求梯度獲得的數(shù)組 
        [-32. ,  -9.5,  -6. , -25. ], 
        [ 14. ,  -8.5, -21. , -11. ], 
        [ 26. ,  1.5,  -0.5,  22. ]])]

對(duì)于n維數(shù)組,np.gradient()函數(shù)會(huì)生成n個(gè)數(shù)組,每個(gè)數(shù)組代表元素在第n個(gè)維度的梯度變化值。梯度反映了元素的變化率,尤其是在進(jìn)行圖像、聲音等數(shù)據(jù)處理時(shí),梯度有助于我們發(fā)現(xiàn)圖像和聲音的邊緣。

1.3.4 隨機(jī)函數(shù)

1.np.random.rand()函數(shù)

np.random.rand()函數(shù)表示根據(jù)給定維度生成[0,1)的數(shù)據(jù),包含0,不包含1。該函數(shù)的一般格式:np.random.rand(d0,d1,…,dn)。其中,dn表示表格的每個(gè)維度。

該函數(shù)的返回值為指定維度的數(shù)組。

【動(dòng)動(dòng)手練習(xí)1-15】 使用隨機(jī)函數(shù)


np.random.rand()     #沒(méi)有參數(shù)時(shí),返回單個(gè)數(shù)據(jù)
0.49622070976935806 
np.random.rand(4)    #shape:4,生成一維數(shù)組 
Out[20]: array([0.73473476, 0.91185891, 0.25690118, 0.15300424]) 
np.random.rand(4,2)  #shape:4*2,生成二維數(shù)組 
array([[0.22766791, 0.44004844], 
       [0.77363055, 0.41738285], 
       [0.4954431 , 0.94661826], 
       [0.98884195, 0.66583906]]) 
np.random.rand(4,3,2)   #shape: 4*3*2,生成三維數(shù)組 
array([[[0.13606573, 0.75197037], 
        [0.10787889, 0.56756818], 
        [0.05749478, 0.21269762]], 
 
       [[0.16066188, 0.77395856], 
        [0.21734109, 0.8403221 ], 
        [0.15336456, 0.08972729]], 
 
       [[0.48081287, 0.65475862], 
        [0.8804478 , 0.56230535], 
        [0.5931349 , 0.61528502]], 
 
       [[0.3535239 , 0.76732365], 
        [0.12317966, 0.6788728 ], 
     [0.84390425, 0.0316394 ]]])

2.np.random.randn()函數(shù)

np.random.randn()函數(shù)表示返回一個(gè)或一組樣本,其具有標(biāo)準(zhǔn)正態(tài)分布。該函數(shù)的一般格式:np.random.randn(d0, d1,…,dn)。其中,dn表示表格的每個(gè)維度。

該函數(shù)返回值為指定維度的數(shù)組。

標(biāo)準(zhǔn)正態(tài)分布是以0為均值、以1為標(biāo)準(zhǔn)差的正態(tài)分布,記為N(0,1)。


np.random.randn()    #沒(méi)有參數(shù)時(shí),返回單個(gè)數(shù)據(jù)
-1.1241580894939212 
np.random.randn(3) 
array([ 1.2128837 ,  1.13688113, -0.13342453]) 
np.random.randn(2,4) 
array([[-1.61193815, -0.75167637,  0.72141234, -1.19118825], 
       [-1.11790307,  0.11534838,  0.51955485, -2.15917405]])

隨機(jī)生成的值基本是?3~+3,但這也不絕對(duì),主要是結(jié)果滿(mǎn)足標(biāo)準(zhǔn)差的正態(tài)分布。

3.np.random.randint()

np.random.randint()函數(shù)表示隨機(jī)生成整數(shù)(或浮點(diǎn)數(shù))數(shù)據(jù)。該函數(shù)的一般格式:np.random.randint(low, high=None, size=None, dtype='l'),取值范圍為[low,high),包含low,不包含high。各參數(shù)說(shuō)明如下。

● low為最小值,high為最大值。

● size為數(shù)組維度的大小。

● dtype為數(shù)據(jù)類(lèi)型,默認(rèn)的數(shù)據(jù)類(lèi)型是np.int。

沒(méi)有填寫(xiě)high時(shí),默認(rèn)生成隨機(jī)數(shù)的范圍是[0,low)。


np.random.randint(1,5)     #返回1個(gè)[1,5)的隨機(jī)整數(shù)
4 
np.random.randint(1,5,3)   #返回3個(gè)[1,5)隨機(jī)整數(shù)的數(shù)組 
array([1, 1, 3]) 
np.random.randint(-5,5,size=(2,2))   #返回一個(gè)二維數(shù)組 
array([[ 2, -1], 
       [ 2,  0]])

4.偽隨機(jī)數(shù)生成器

在機(jī)器學(xué)習(xí)中,生成隨機(jī)數(shù)通常使用偽隨機(jī)數(shù)生成器np.random. RandomState(),要想復(fù)現(xiàn)具備隨機(jī)性的代碼的最終結(jié)果,需要設(shè)置相同的種子值。


import numpy as np
rng = np.random.RandomState(0)   #設(shè)定隨機(jī)種子值,此時(shí)設(shè)置為0,也可以是任意整數(shù) 
rng.rand(4)    #產(chǎn)生4個(gè)隨機(jī)數(shù),空括號(hào)則表示產(chǎn)生一個(gè)隨機(jī)數(shù) 
Out[377]: array([0.5488135 , 0.71518937, 0.60276338, 0.54488318]) 
rng = np.random.RandomState(0)   #隨機(jī)種子數(shù)相同,結(jié)果相同 
rng.rand(4) 
Out[379]: array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])

上面的代碼生成了一樣的隨機(jī)數(shù)組。下面是另一種順序的操作。


rng = np.random.RandomState(100)  #隨機(jī)種子數(shù)為100
rng.rand(4) 
Out[35]: array([0.54340494, 0.27836939, 0.42451759, 0.84477613]) 
rng.rand(4) 
Out[36]: array([0.00471886, 0.12156912, 0.67074908, 0.82585276]) 
rng = np.random.RandomState(100) 
rng.rand(4) 
Out[38]: array([0.54340494, 0.27836939, 0.42451759, 0.84477613]) 
rng.rand(4) 
Out[39]: array([0.00471886, 0.12156912, 0.67074908, 0.82585276])

因?yàn)閚p.random.RandomState()是偽隨機(jī)數(shù),所以必須在rng這個(gè)變量下使用,如果不這樣做,那么就不能得到相同的隨機(jī)數(shù)組。在使用rng這個(gè)變量前要先定義,定義之后生成隨機(jī)數(shù)的結(jié)果才有順序關(guān)系。

1.3.5 其他常用函數(shù)

其他常用函數(shù)還包括數(shù)學(xué)函數(shù)、統(tǒng)計(jì)函數(shù)等,見(jiàn)表1-2。

表1-2 其他常用函數(shù)

續(xù)表

主站蜘蛛池模板: 大余县| 滁州市| 突泉县| 大连市| 高尔夫| 平凉市| 奉新县| 镇原县| 宜兰市| 太湖县| 德惠市| 农安县| 吕梁市| 新竹县| 蛟河市| 澳门| 格尔木市| 五台县| 榆树市| 靖安县| 斗六市| 亳州市| 武清区| 于都县| 株洲县| 莱州市| 陇西县| 涞源县| 额敏县| 建德市| 桂平市| 铁岭县| 泾源县| 奇台县| 唐海县| 米易县| 象州县| 阳高县| 陕西省| 潞西市| 轮台县|