- Python數(shù)據(jù)分析與挖掘
- 齊福利 楊玲主編
- 4965字
- 2024-03-14 11:21:32
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ù)表

- 混凝土工
- 食品衛(wèi)生預(yù)防知識(shí)讀本(安全預(yù)防與平安生活)
- 機(jī)電設(shè)備狀態(tài)監(jiān)測(cè)與預(yù)測(cè)
- 真情的服務(wù):中國(guó)石油礦區(qū)優(yōu)秀服務(wù)案例匯編
- 手機(jī)游戲測(cè)試
- 汽車(chē)機(jī)械制圖(第2版)
- 2017年陜西省普通高等學(xué)校招生考試統(tǒng)計(jì)年報(bào)
- 汽車(chē)故障診斷技術(shù)學(xué)習(xí)工作單
- 馬克筆最美山水繪(全彩視頻版)
- 馬克筆基礎(chǔ)教程(全彩視頻版)
- 應(yīng)用文寫(xiě)作
- 汽車(chē)改裝技術(shù)一本通
- 中文版Photoshop CS5完全自學(xué)教程(超值版)
- 月嫂服務(wù)技能培訓(xùn)教程
- 醬類(lèi)生產(chǎn)技術(shù)