8.1、numpy
本質(zhì)是多維數(shù)組對(duì)象
list 類(lèi)型轉(zhuǎn)為 numpy 數(shù)組 更有利科學(xué)計(jì)算
8.1.1、為什么用 numpy?
1.雖然Python數(shù)組結(jié)構(gòu)中的列表list實(shí)際上就是數(shù)組,但是列表list保存的是對(duì)象的指針,list中的元素在系統(tǒng)內(nèi)存中是分散存儲(chǔ)的,例如[0,1,2]需要3個(gè)指針和3個(gè)整數(shù)對(duì)象,浪費(fèi)內(nèi)存和計(jì)算時(shí)間。
2.NumPy數(shù)組存儲(chǔ)在一個(gè)均勻連續(xù)的內(nèi)存塊中,訪(fǎng)問(wèn)更快;NumPy中的矩陣計(jì)算可以采用多線(xiàn)程的方式,計(jì)算更快。
結(jié)論:numpy 可提供高性能的矩陣運(yùn)算,作為數(shù)組 numpy 提供了許多方便統(tǒng)計(jì)計(jì)算的功能,數(shù)組結(jié)構(gòu)為ndarray。
numpy 和 list 有什么區(qū)別?
從存儲(chǔ)數(shù)據(jù)來(lái)看,numpy 存儲(chǔ)的是矩陣,list 存儲(chǔ)的是序列
下面舉個(gè)例子
li = [1,2,3,4]
Out: [1, 2, 3, 4]
arr = np.array(li)
Out: [1 2 3 4]
8.1.2、numpy 數(shù)據(jù)類(lèi)型推理
numpy 會(huì)對(duì)數(shù)據(jù)類(lèi)型進(jìn)行推理,規(guī)則:轉(zhuǎn)為適用性更強(qiáng)的數(shù)據(jù)類(lèi)型。
下面舉個(gè)例子:
為什么會(huì)進(jìn)行數(shù)據(jù)類(lèi)型推理?
numpy 適合處理統(tǒng)一的數(shù)值數(shù)組數(shù)據(jù),數(shù)據(jù)類(lèi)型推理就是為了保證數(shù)值類(lèi)型統(tǒng)一。
8.1.3、numpy 指定長(zhǎng)度數(shù)組快速創(chuàng)建
”零矩陣“
np.zeros()
np.zeros((3,4))
np.zeros((1,3,4))
np.zeros((1,1,3,4))
超出二維后的形式,以
np.zeros((1,3,4))
為例,嵌套1層,層內(nèi)3行4列;array([[[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]])
(1,1,3,4)相比(1,3,4),增加一維,多嵌套一層:
array([[[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]])
(2,1,3,4)相比(1,1,3,4),數(shù)值增加,平行矩陣增加:
array([[[[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]], [[[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]]])
補(bǔ)充:
”1矩陣“
np.ones((row,col))
8.1.4、numpy 哪個(gè)是行、列?
最后兩組數(shù)為行和列。
倒是第一組為列,倒數(shù)第二組為行(若存在)
8.1.5、numpy 如何進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換?
arr = np.array([1.1,1.2,-1,-3.3])
以 arr 為例,將 arr 內(nèi)的數(shù)據(jù)類(lèi)型轉(zhuǎn)為 int32:
arr.astype(np.int32)
8.1.6、numpy 有幾種乘法?
四種。
1)星乘(*)
數(shù)組的對(duì)應(yīng)元素相乘
arr1 * arr2
2)點(diǎn)乘(np.dot)
就是矩陣乘法
a = np.array([...])
b = np.array([...])
np.dot(a,b)
3)叉乘(np.cross)、外乘(np.outer)
細(xì)說(shuō)NumPy數(shù)組的四種乘法的使用
8.1.7、numpy 索引和切片操作
舉個(gè)例子:
補(bǔ)充:
花式索引
通過(guò)整型數(shù)組進(jìn)行索引
花式索引為什么有兩層中括號(hào)?
以數(shù)組對(duì)象 arr 為例,向arr[]中傳入數(shù)組作為參數(shù),所以才有了兩個(gè)中括號(hào)
在機(jī)器學(xué)習(xí)中常通過(guò)使用花式索引來(lái)打亂數(shù)據(jù)集的樣本順序,避免機(jī)器學(xué)習(xí)模型學(xué)習(xí)到樣本的位置噪聲,對(duì)于監(jiān)督學(xué)習(xí)的數(shù)據(jù)集如果打亂了樣本還需要打亂相對(duì)應(yīng)的標(biāo)簽值,樣本與標(biāo)簽都是一一對(duì)應(yīng)的關(guān)系,使用花式索引能夠輕松的解決。
注意,這里有一個(gè)問(wèn)題:
arr = np.arange(12).reshape((3,4)) print(arr[[0,2]])
Out:
[[ 0 1 2 3] [ 8 9 10 11]]
換一個(gè)寫(xiě)法,將 reshape 拆開(kāi),無(wú)法得到想要的結(jié)果(尚不知具體原因):
arr.reshape() 本身不會(huì)改變arr,而是得到改變形狀后的一個(gè)返回值,這就是原因。——2023.7.11
這個(gè)寫(xiě)法又有一種補(bǔ)救(2023-5-16):d = np.arange(12) print(d.reshape(3,4)[[0,2]])
要用花式索引,不要讓reshape方法‘’單著‘’
Out:
[[ 0 1 2 3] [ 8 9 10 11]]
8.1.8、numpy 比較運(yùn)算
names = np.array(['名字1','名字2','名字3'])
sex = np.array(['M','F'])
這里舉幾個(gè) and、or 的例子:
(names == '名字4') & (sex == 'M')
Out:array([False, False, False])
(names == '名字1') | (names == '名字5')
Out:array([ True, False, False])
8.1.9、numpy 如何指定行列?
arr = np.arange(16)
以 arr 為例,整成 4行4列:
arr.reshape(4,4)
Out:
array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]])
8.1.10、numpy 如何轉(zhuǎn)置?
比 list 強(qiáng)大之處,舉個(gè)例子:
arr = np.arange(24).reshape((3,8))
arr.T#轉(zhuǎn)置
Out:
array([[ 0, 8, 16], [ 1, 9, 17], [ 2, 10, 18], [ 3, 11, 19], [ 4, 12, 20], [ 5, 13, 21], [ 6, 14, 22], [ 7, 15, 23]])
補(bǔ)充:
軸轉(zhuǎn)置
arr 為三維矩陣,初始時(shí)刻存在的三個(gè)軸下標(biāo)分別0、1、2,基于下標(biāo)完成軸轉(zhuǎn)置,如下圖:
8.1.11、numpy where 函數(shù)
res = [x if c else y for x,y,c in zip(x_arr,y_arr,conditon)]#list對(duì)象
res = np.array(res)#numpy對(duì)象
等價(jià)表示
res = np.where(condition,x_arr,y_arr) #返回numpy對(duì)象
若條件 condition 成立,取 x_arr,否則取 y_arr 。
8.1.12、 numpy 如何值替換?
arr = np.random.randn(4,4)# 4*4隨機(jī)矩陣
利用8.1.11提到的where函數(shù),實(shí)現(xiàn)值替換,舉個(gè)例子,將正數(shù)替換為5,負(fù)數(shù)為-5:
arr = np.where(arr>0,5,-5)
8.1.13、numpy 數(shù)學(xué)運(yùn)算
1)生成隨機(jī)矩陣
例如生成一個(gè)4*4隨機(jī)矩陣:
arr = np.random.randn(4,4)
隨機(jī)矩陣生成,數(shù)據(jù)源有兩種,
np.random.rand()
np.random.randn()
rand()
:取值從0,1之間的均勻分布中抽樣。
randn()
:取值從以0為均值,1為方差的標(biāo)準(zhǔn)正態(tài)分布中抽樣。
例如,生成4 * 4 隨機(jī)矩陣,
arr = np.random.randn(4,4)# 4*4隨機(jī)矩陣 print(arr) arr = np.random.rand(4,4)# 4*4隨機(jī)矩陣 print(arr)
Out:
[[-0.38672283 0.2510875 0.84164035 -1.171516 ] [-0.34456511 -1.43556016 0.78061698 0.68466033] [-1.05684828 0.66353918 -0.16626838 -1.0837476 ] [-0.54743772 -0.70599557 -0.24332244 -0.18156644]] [[0.63981419 0.56708754 0.03062314 0.77049354] [0.79681395 0.12707638 0.05749961 0.21459898] [0.62925634 0.10423857 0.47172718 0.57837616] [0.68260032 0.54003265 0.57571165 0.50320049]]
2)平均值、求和
怎么確定 axis 方向?
以 arr 對(duì)象為例:
arr.mean()#對(duì)所有元素
arr.mean(axis = 0)#0軸沿著行的方向垂直向下運(yùn)算
arr.mean(axis = 1)#1軸沿著列的方向水平延伸運(yùn)算
arr.sum()
3)排序
以 arr 對(duì)象為例:
arr.sort()
:返回的是原數(shù)組的“視圖”,而不是 copy文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-430854.html
np.sort(arr)
:返回的是原數(shù)組的 copy, 而不是“視圖”,當(dāng)有保留原 arr 需求時(shí)用這個(gè)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-430854.html
到了這里,關(guān)于科學(xué)計(jì)算庫(kù)—numpy隨筆的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!