NumPy(Numerical Python) 是 Python的一個(gè)很重要的第三方庫,支持大量的維度數(shù)組與矩陣運(yùn)算,,此外也針對數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫,。很多其他科學(xué)計(jì)算的第三方庫都是以Numpy為基礎(chǔ)建立的,比如pandas的數(shù)據(jù)就是以numpy為基礎(chǔ),。 numpy 是一個(gè)科學(xué)計(jì)算庫 ,,它的核心:多維數(shù)組-ndarray(數(shù)組)。ndarray 數(shù)據(jù)存儲方式和list不一樣,,ndarray是用一塊整體的內(nèi)存來存儲數(shù)據(jù)的,。 ![]() 一,、首先導(dǎo)入包import numpy as np 二,、創(chuàng)建數(shù)組通過list創(chuàng)建、np.array初始化通過list創(chuàng)建,、然后使用np.array對其進(jìn)行初始化而創(chuàng)建數(shù)組,。
reshape創(chuàng)建二維數(shù)組通過reshape創(chuàng)建二維數(shù)組 x = np.arange(10).reshape((2, 5))print(x)print(x[1, 4])print(x.shape[0])# [[0 1 2 3 4]# [5 6 7 8 9]]# 9# 2 二維數(shù)組的索引方式有兩種,第一種是a[x][y]的方式,,另一種是a[x,y],,通常更推薦后者。 數(shù)組array屬性
輸出結(jié)果如下: <class 'numpy.ndarray'>arr: [[[1 2]] [[2 3]] [[3 4]] [[4 5]]]數(shù)組的維度: 3數(shù)組的形狀: (4, 1, 2)數(shù)組的元素個(gè)數(shù): 8數(shù)組的數(shù)組類型: int32數(shù)組的每個(gè)元素的大小: 4 特殊數(shù)組np.empty空數(shù)組創(chuàng)建生成空數(shù)組,,np.empty空數(shù)組創(chuàng)建
通過np.empty創(chuàng)建3*2的int的空數(shù)組,,數(shù)組元素為隨機(jī)值,因?yàn)樗鼈兾闯跏蓟?/span> np.zeros()生成全0數(shù)組,,,通過dtype可以指定數(shù)組中元素類型 z = np.zeros(10)print(z) # 默認(rèn)是浮點(diǎn)數(shù) [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]z1 = np.zeros(10, dtype='int64')print(z1) # [0 0 0 0 0 0 0 0 0 0] np.zeros_like創(chuàng)建一個(gè)與給定數(shù)組具有相同形狀的數(shù)組,,數(shù)組元素以 0 來填充。 numpy.zeros 可以直接指定要?jiǎng)?chuàng)建的數(shù)組的形狀,,而 numpy.zeros_like 則是創(chuàng)建一個(gè)與給定數(shù)組具有相同形狀的數(shù)組,。
np.ones()生成全1數(shù)組 one = np.ones(10, dtype='int64')print(one) # [1 1 1 1 1 1 1 1 1 1] numpy.ones_like創(chuàng)建一個(gè)與給定數(shù)組具有相同形狀的數(shù)組,,數(shù)組元素以 1 來填充,。numpy.ones 可以直接指定要?jiǎng)?chuàng)建的數(shù)組的形狀,,而 numpy.ones_like 則是創(chuàng)建一個(gè)與給定數(shù)組具有相同形狀的數(shù)組。
np.arange生成某個(gè)范圍內(nèi)的數(shù)組 aa = np.arange(10)# [0 1 2 3 4 5 6 7 8 9]bb = np.arange(0, 10, 3,dtype = float) # 指定起始點(diǎn) 終止點(diǎn) 以及 step# [0 3 6 9] numpy.linspace創(chuàng)建一個(gè)一維數(shù)組,,數(shù)組是一個(gè)等差數(shù)列構(gòu)成的
numpy.logspace創(chuàng)建一個(gè)于等比數(shù)列,。 # 默認(rèn)底數(shù)是 10a = np.logspace(1.0, 2.0, num = 10) print (a)#[ 10. 12.91549665 16.68100537 21.5443469 27.82559402 # 35.93813664 46.41588834 59.94842503 77.42636827 100. ] np.eye()生成單位矩陣,,即生成對角為1的二維矩陣。
三,、數(shù)組的切片操作array和list的切片區(qū)別 a = list(range(10))b = np.arange(10)a1 = a[0:4]b1 = b[0:4]print('a_list:{}'.format(a))print('b_array:{}'.format(b))print('a1_list:{}'.format(a1))print('b1_array:{}'.format(b1))print('修改a1[0]和b1[0]的值之后:')a1[0] = 11b1[0] = 11print('修改之后的a_list:{}'.format(a)) # list的值并沒有被修改 它相當(dāng)于是一種淺拷貝print('修改之后的b_array:{}'.format(b)) # array的值被修改# 說明對array來說,,切片操作其實(shí)是對原array的引用,實(shí)際上是一種淺拷貝 運(yùn)行結(jié)果如下:
需要注意的點(diǎn)a = b,,完全不復(fù)制,,ab會相互影響; a = b[:],,切片操作,,會創(chuàng)建新的對象a,但是兩者的變化是一致的,; a = b.copy(),,復(fù)制,兩者互不影響,,相當(dāng)于深拷貝,。 二維數(shù)組切片a = np.arange(15).reshape((3, 5))print(a)# [[ 0 1 2 3 4]# [ 5 6 7 8 9]# [10 11 12 13 14]]print(a[0:2, 0:2])# [[0 1]# [5 6]]print(a[0:2][0:2])# [[0 1 2 3 4]# [5 6 7 8 9]]# 只有前一種方法湊效print(a[1:, 2:4])# [[ 7 8]# [12 13]] 四、數(shù)組索引布爾索引 將布爾表達(dá)式作為索引
其實(shí)它的實(shí)際操作是這樣的 c = np.array([1, 2, 3, 4])d = [True, True, False, True]print(c[d]) # [1, 2, 4]print(a > 5) # [False False False False False False True True True True]print(a[a > 5]) # [6 7 8 9] 取a中大于5的偶數(shù)
取a中大于5的數(shù)和所有偶數(shù) c = a[(a > 5) | (a % 2 == 0)]print(c) # [0 2 4 6 7 8 9] 花式索引傳進(jìn)去一個(gè)列表作為索引,,可以取到相應(yīng)位置上的值 也可以和切片操作,、布爾索引結(jié)合
五、numpy中的重要函數(shù)np.isnannan(not a number)不是一個(gè)數(shù),,類型是<class 'float'>,。 兩個(gè)NaN是不相等的 np.nan == np.nan ==> False np.nan != np.nan ==> True # 判斷nan的方法是np.isnan(a)a = np.arange(5)a = a / aprint(a) # [nan 1. 1. 1. 1.]print(np.isnan(a)) # [True False False False False]# 去掉數(shù)組中nan的方法b = a[~np.isnan(a)] # [1. 1. 1. 1.]# 統(tǒng)計(jì)數(shù)組中nan的個(gè)數(shù)np.count_nonzero(a != a) np.isinfinf是無窮大,也是float型數(shù)據(jù),。用法同isnan
np.random隨機(jī)產(chǎn)生一個(gè)數(shù) t = np.random.rand(2,4) # 產(chǎn)生多個(gè)維度均勻分布的數(shù) 或者 數(shù)組 范圍0~1# [[0.90817816 0.75715337 0.64737834 0.79045973]# [0.80215137 0.04848201 0.66005689 0.32470002]]t = np.random.randn(4) # 產(chǎn)生多個(gè)維度成標(biāo)準(zhǔn)正態(tài)分布的數(shù)組 均值為0 標(biāo)準(zhǔn)差為1# [ 0.33196007 -1.59954454 -1.22863283 0.49101622]a = np.random.random() 產(chǎn)生某個(gè)范圍內(nèi)的整數(shù)或數(shù)組
產(chǎn)生成均勻分布的數(shù)組a = np.random.uniform(2.0, 10.0, 10)print(a)# [3.10070825 2.54493484 8.07038208 6.74178579 2.9491971 9.9813392 3.58365099 8.4720269 4.73902394 6.50748841]a = np.random.uniform(2.0, 10.0, (2, 5))print(a)# [[6.86870706 8.48767828 3.35503304 2.35793278 6.05281056]# [9.67359048 3.16650548 7.81726608 2.72933486 2.22826293]] 隨機(jī)數(shù)種子因?yàn)橛?jì)算機(jī)每次生成的都是偽隨機(jī)數(shù),,在指定隨機(jī)數(shù)種子之后,生成的隨機(jī)數(shù)就不會改變,。
隨機(jī)選擇數(shù)組中的數(shù)形成新數(shù)組a = np.random.choice([1, 2, 3, 4, 5], 10) # 最后一個(gè)參數(shù)是生成數(shù)組的形狀print(a) # [2 2 2 2 1 1 3 5 3 3] np.where函數(shù)np.where函數(shù)的使用,,可以理解為: (1)三個(gè)參數(shù)np.where(condition,x,y) : 滿足條件(condition)輸出x, 不滿足則輸出y ; (2)一個(gè)參數(shù)np.where(arr) : 輸出arr中“真”值的坐標(biāo),簡單理解為不為0的坐標(biāo),。
其它函數(shù)print(np.maximum(a, b))print(np.minimum(a, b))a = np.array([1, 2, 3, 4, 5])# 若a是二維數(shù)組,,則可以指定axis用以在不同軸上取數(shù)據(jù)t1 = np.arange(0, 20).reshape((4, 5))print(t1.sum(axis=0)) # 枚舉行# [30 34 38 42 46]print(t1.sum(axis=1)) # 枚舉列# [10 35 60 85]print(a.max())print(a.min())print(a.mean())print(a.sum())print(a.argmax())print(a.argmin())print(a.std())print(a.var()) 四舍五入相關(guān)類
六、數(shù)組的拼接vstack和hstack垂直拼接需要保證兩個(gè)數(shù)組在列維度上大小相同 水平拼接需要保證兩個(gè)數(shù)組在行維度上大小相同 # 垂直拼接t1 = np.arange(0, 10).reshape((2, 5))t2 = np.arange(11, 21).reshape((2, 5))tv = np.vstack((t1, t2))print(tv)# [[ 0 1 2 3 4]# [ 5 6 7 8 9]# [11 12 13 14 15]# [16 17 18 19 20]] # 水平拼接
數(shù)組的行列交換t1 = np.arange(0, 20).reshape((4, 5))print(t1)# [[ 0 1 2 3 4]# [ 5 6 7 8 9]# [10 11 12 13 14]# [15 16 17 18 19]]t1[[1, 2], :] = t1[[2, 1], :] # 行交換之后print(t1)# [[ 0 1 2 3 4]# [10 11 12 13 14]# [ 5 6 7 8 9]# [15 16 17 18 19]]t1[:, [0, 1]] = t1[:, [1, 0]] # 列交換之后print(t1)# [[ 1 0 2 3 4]# [11 10 12 13 14]# [ 6 5 7 8 9]# [16 15 17 18 19]] ![]() 七,、NumPy 矩陣庫(Matrix)NumPy 中包含了一個(gè)矩陣庫 numpy.matlib,,該模塊中的函數(shù)返回的是一個(gè)矩陣,而不是 ndarray 對象,。 轉(zhuǎn)置矩陣NumPy 中除了可以使用 numpy.transpose 函數(shù)來對換數(shù)組的維度,還可以使用 T 屬性,。 # 水平拼接
矩陣計(jì)算方法加法,、減法、乘法,、除法,、整除、乘方,、求余,、求倒數(shù)、求絕對值,、求三角函數(shù)和反三角函數(shù),、以 e 為底的函數(shù)值、n 的 x 次方,、求對數(shù)函數(shù)等,。這個(gè)很好理解,就是對矩陣中每個(gè)元素進(jìn)行計(jì)算,。 import numpy as npx = np.arange(1,16).reshape(3,5)print(x)# 加法(減法)x1 = x + 1print(x1)# 除法(乘法)x2 = 2 * xprint(x2)x3 = 2 / xprint(x3)# 向下取整x4 = x // 3print(x4)# 取余x5 = x % 3print(x5)#絕對值x6 = np.abs(x)print(x6)#正弦sinx = np.sin(x)print(sinx) #余弦cosx = np.cos(x)print(cosx) #正切tanx = np.tan(x)print(tanx) # 反正弦 arcsinx = np.arcsin(x)print(arcsinx)# 反余弦arccosx = np.arccos(x)print(arccosx)# 反正切arctanx = np.arctan(x)print(arctanx)#次方運(yùn)算xxx = x **3print(xxx)xx = 2 ** xprint(xx)# 指數(shù)函數(shù)e**xexpx = np.exp(x)#開平方:sqrtsqrtx = np.sqrt(x)print(sqrtx)#power(a,b):求a的b次方powerx = np.power(2,x)#log函數(shù):不指定值時(shí)默認(rèn)就是loge函數(shù),,以e為底的對數(shù)lnx = np.log(x)print(lnx)#long2:以2為底的對數(shù)ln2x = np.log2(x)print(ln2x)#long10:以10為底的對數(shù)ln10x = np.log10(x)print(ln10x) 矩陣運(yùn)算矩陣的運(yùn)算:兩個(gè)矩陣加法、減法,、乘法,。
矩陣的轉(zhuǎn)置# 矩陣的轉(zhuǎn)置AT = A.Tprint(AT) 向量與矩陣的運(yùn)算加法(數(shù)學(xué)上無意義),,相當(dāng)于將矩陣的每一行加上向量對應(yīng)的值,。
乘法(與矩陣間計(jì)算相似),注:向量與矩陣相乘時(shí),,若不滿足數(shù)學(xué)計(jì)算規(guī)則,,numpy會自動將矩陣進(jìn)行轉(zhuǎn)置。 矩陣的堆疊np.title(v, (2,2))np.title(v, (2,1)) 矩陣的逆
生成偽逆矩陣np.linalg.pinv() 八,、NumPy 線性代數(shù)
numpy.dot()a = np.array([[1,2],[3,4]])b = np.array([[11,12],[13,14]])print(np.dot(a,b)) 輸出結(jié)果為:[[37 40] [85 92]] 計(jì)算式為:[[1*11+2*13, 1*12+2*14],[3*11+4*13, 3*12+4*14]] numpy.vdot()numpy.vdot() 函數(shù)是兩個(gè)向量的點(diǎn)積,。 如果第一個(gè)參數(shù)是復(fù)數(shù),,那么它的共軛復(fù)數(shù)會用于計(jì)算。 如果參數(shù)是多維數(shù)組,,它會被展開,。
計(jì)算式為:1*11 + 2*12 + 3*13 + 4*14 = 130 numpy.inner()numpy.inner() 函數(shù)返回一維數(shù)組的向量內(nèi)積,。對于更高的維度,它返回最后一個(gè)軸上的和的乘積,。 import numpy as np print (np.inner(np.array([1,2,3]),np.array([0,1,0])))# 等價(jià)于 1*0+2*1+3*0#2 多維數(shù)組:
內(nèi)積計(jì)算式為: 1*11+2*12, 1*13+2*14 3*11+4*12, 3*13+4*14 numpy.linalg.det()numpy.linalg.det() 函數(shù)計(jì)算輸入矩陣的行列式,。 行列式在線性代數(shù)中是非常有用的值。 它從方陣的對角元素計(jì)算,。 對于 2×2 矩陣,,它是左上和右下元素的乘積與其他兩個(gè)的乘積的差。 換句話說,,對于矩陣[[a,,b],[c,,d]],,行列式計(jì)算為 ad-bc。 較大的方陣被認(rèn)為是 2×2 矩陣的組合,。 import numpy as npa = np.array([[1,2], [3,4]]) print (np.linalg.det(a))#-2.0 numpy.linalg.solve()numpy.linalg.solve() 函數(shù)給出了矩陣形式的線性方程的解,。 求解方程組 x0 + 2 * x1 = 1 和 3 * x0 + 5 * x1 = 2 :
numpy.linalg.inv()numpy.linalg.inv() 函數(shù)計(jì)算矩陣的乘法逆矩陣。 逆矩陣(inverse matrix):設(shè)A是數(shù)域上的一個(gè)n階矩陣,,若在相同數(shù)域上存在另一個(gè)n階矩陣B,,使得: AB=BA=E ,則我們稱B是A的逆矩陣,,而A則被稱為可逆矩陣,。注:E為單位矩陣。 九,、數(shù)組的保存與讀取save 以二進(jìn)制形式來保存數(shù)組保存的文件是以.npy為后綴的二進(jìn)制文件,,參數(shù)1: 保存的文件路徑名稱,可省略文件名后綴,。 np.save('./arr1',arr1) 3,、讀取npy文件
4、通過savez來保存多個(gè)數(shù)組
np.savez('./arr2', arr1, arr2) 5,、加載文件中的數(shù)組
6,、文本形式的保存
7、加載文本形式的數(shù)組data = np.loadtxt('./arr1.txt', dtype=float,delimiter=' ') 8,、genfromtxt可以讀取結(jié)構(gòu)化數(shù)組和缺失數(shù)據(jù)genfromtxt讀取文件和loadtxt類似,,所不同的是,參數(shù)filling_values 指定缺失時(shí)填充的數(shù)據(jù),。
十,、數(shù)組的倒序1. 升序排序,,而且會對原數(shù)組產(chǎn)生影響arr.sort() 2、argsort 返回的是排序之后,,元素所在原來位置的索引
3,、lexsort 按照最后一個(gè)數(shù)組的規(guī)則來排序十一、數(shù)組的去重與重復(fù)unique去重+排序title重復(fù)數(shù)組,,重復(fù)對象為整體repeat按照列進(jìn)行重復(fù)數(shù)據(jù),,重復(fù)對象為列或行#axis=1, 按列res = np.repeat(arr1,2,axis=1)#axis=0, 按行res = np.repeat(arr1,2,axis=0) 十二、NumPy 字符串函數(shù)以下函數(shù)用于對 dtype 為 numpy.string_ 或 numpy.unicode_ 的數(shù)組執(zhí)行向量化字符串操作,。 它們基于 Python 內(nèi)置庫中的標(biāo)準(zhǔn)字符串函數(shù)。這些函數(shù)在字符數(shù)組類(numpy.char)中定義,。
![]() |
|