【NumPy】常用姿勢(shì)積累
文章目錄

1.矩陣運(yùn)算
2.arange()生成ndarray數(shù)組
3.meshgrid
4.通過(guò)array轉(zhuǎn)為二維數(shù)組
5.利用 ix_()函數(shù)進(jìn)行數(shù)組切片
6.數(shù)組連接
7.數(shù)據(jù)的存取
8.求逆、解方程、特征值
9.奇異值分解、計(jì)算行列式
10.argsort函數(shù)
Reference
如何導(dǎo)入并使用Numpy創(chuàng)建數(shù)組以及相關(guān)的數(shù)組運(yùn)算、獲得數(shù)組的尺寸、數(shù)組的四則運(yùn)算與數(shù)學(xué)函數(shù)運(yùn)算、數(shù)組的切片、數(shù)組連接和數(shù)據(jù)的存取、數(shù)組形態(tài)變換、數(shù)組元素的排序與搜索、矩陣及線(xiàn)性代數(shù)運(yùn)算等相關(guān)知識(shí)。
由于Numpy借鑒了Matlab矩陣開(kāi)發(fā)思路,故Numpy的數(shù)組創(chuàng)建、運(yùn)算、切片、連接及存取、排序與搜索、矩陣及線(xiàn)性代數(shù)運(yùn)算均與Matlab的矩陣操作極為相似。
NumPy 是一個(gè)運(yùn)行速度非常快的數(shù)學(xué)庫(kù),主要用于數(shù)組計(jì)算,包含:
一個(gè)強(qiáng)大的N維數(shù)組對(duì)象 ndarray
廣播功能函數(shù)
整合 C/C++/Fortran 代碼的工具
線(xiàn)性代數(shù)、傅里葉變換、隨機(jī)數(shù)生成等功能
Numpy中,矩陣有兩種表示方式:
matrix類(lèi)時(shí),比如2 x 3矩陣A不能和A自身相乘
array類(lèi)時(shí),上面的A則可以相乘,默認(rèn)的乘法是Hadamard乘法(即矩陣之間的逐點(diǎn)乘積,對(duì)應(yīng)的矩陣元素相乘)。
1.矩陣運(yùn)算
(1)dot是點(diǎn)積,a.dot(b) 與 np.dot(a,b)效果相同。如果是直接A*B則是兩個(gè)矩陣對(duì)應(yīng)位置的元素分別進(jìn)行相乘得到新的矩陣。
矩陣積計(jì)算不遵循交換律,np.dot(a,b) 和 np.dot(b,a) 得到的結(jié)果是不一樣的
(2)transpose是矩陣轉(zhuǎn)置
(3)inv是求矩陣的逆
import numpy as np from numpy.linalg import inv A = np.matrix([[1, 2], [3, 4], [5, 6]]) print(A) print("=================") B = np.matrix(range(1, 7)).reshape(3, 2) print(B) print("=================") # 創(chuàng)建特殊矩陣 ans1 = np.zeros((3, 2)) print(ans1) print("=================") ans2 = np.identity(3) print(ans2) print("=================") # 矩陣中向量的提取 m = np.array(range(1, 10)).reshape(3, 3) print(m) print("=================") # 提取行向量 ans3 = m[[0, 2]] # m[[True, False, True]] print(ans3) print("=================") # 提取列向量 ans4 = m[:, [1, 2]] # 或者m[:, [False, True, True]] print(ans4) print("=================") # 矩陣的運(yùn)算 n = np.array(range(1, 5)).reshape(2, 2) print(n) print("=================") np.transpose(n) print(n) print("=================") add = n + n print(add) print("=================") plus = n - n print(plus) print("=================") # 矩陣的逆矩陣 #ni = inv(n) #print(ni) # 矩陣的逆和原矩陣相乘得到單位矩陣 danwei = np.dot(inv(n), n) print(danwei)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
2.arange()生成ndarray數(shù)組
Numpy 中 arange() 主要是用于生成數(shù)組,具體用法如下
numpy.arange(start, stop, step, dtype = None)
在給定間隔內(nèi)返回均勻間隔的值。
值在半開(kāi)區(qū)間 [開(kāi)始,停止]內(nèi)生成(換句話(huà)說(shuō),包括開(kāi)始但不包括停止的區(qū)間),返回的是 ndarray 。
from numpy import * # 引入numpy A = arange(5) # 只有結(jié)束項(xiàng) print(A) # 結(jié)果 [0 1 2 3 4] 結(jié)果不包含結(jié)束項(xiàng) print(type(A)) # 結(jié)果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
3.meshgrid
meshgrid適合畫(huà)3D圖,而mgrid適合畫(huà)2D圖。
適用于生成網(wǎng)格型數(shù)據(jù),可以接受兩個(gè)一維數(shù)組生成兩個(gè)二維矩陣,對(duì)應(yīng)兩個(gè)數(shù)組中所有的(x,y)對(duì)。
那么生成的第一個(gè)二維數(shù)組是以xarray為行,共ydimesion行的向量;
而第二個(gè)二維數(shù)組是以yarray的轉(zhuǎn)置為列,共xdimesion列的向量。
import numpy as np xnums = np.arange(4) #print(xnums)# [0 1 2 3] #print(type(xnums)) #
1
2
3
4
5
6
7
8
9
10
11
12
13
輸出結(jié)果為:
[array([[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]), array([[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]])] (5, 4) (5, 4) [[0 1 2 3] [0 1 2 3] [0 1 2 3] [0 1 2 3] [0 1 2 3]] [[0 0 0 0] [1 1 1 1] [2 2 2 2] [3 3 3 3] [4 4 4 4]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
4.通過(guò)array轉(zhuǎn)為二維數(shù)組
L=[[1,2],[3,4]] #定義待轉(zhuǎn)化的嵌套列表L print(L) import numpy #導(dǎo)入Numpy包 A=numpy.array(L) #調(diào)用Numpy包中提供的函數(shù)array(),將L轉(zhuǎn)化為二維數(shù)組并賦給A # 即將數(shù)據(jù)轉(zhuǎn)為數(shù)組的形式 print(A) # [[1, 2], [3, 4]] # [[1 2] [3 4]]
1
2
3
4
5
6
7
8
9
也可以用其他的嵌套方式再用array函數(shù):
#1.先預(yù)定義列表d1,元組d2,嵌套列表d3、d4和嵌套元組d5 d1=[1,2,3,4,0.1,7] #列表 d2=(1,2,3,4,2.3) #元組 d3=[[1,2,3,4],[5,6,7,8]] #嵌套列表,元素為列表 d4=[(1,2,3,4),(5,6,7,8)] #嵌套列表,元素為元組 d5=((1,2,3,4),(5,6,7,8)) #嵌套元組 #2.導(dǎo)入Numpy,并調(diào)用其中的array函數(shù),創(chuàng)建數(shù)組 import numpy as np d11=np.array(d1) d21=np.array(d2) d31=np.array(d3) d41=np.array(d4) d51=np.array(d5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5.利用 ix_()函數(shù)進(jìn)行數(shù)組切片
# 2.5.2 利用 ix_()函數(shù)進(jìn)行數(shù)組切片 import numpy as np D=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]) #定義數(shù)組D #提取D中行數(shù)為1、2,列數(shù)為1、3的所有元素 D3=D[np.ix_([1,2],[1,3])] #提取D中行數(shù)為0、1,列數(shù)為1、3的所有元素 D4=D[np.ix_(np.arange(2),[1,3])] #提取以D中第1列小于11得到的邏輯數(shù)組作為行索引,列數(shù)為1、2的所有元素 D6=D[np.ix_(D[:,1]<11,[1,2])] #提前以D中第1列小于11得到的邏輯數(shù)組作為行索引,列數(shù)為2的所有元素 D7=D[np.ix_(D[:,1]<11,[2])] #提前以第2.5.1節(jié)中的TF=[True,False,False,True]邏輯列表為行索引,列數(shù)為2的所有元素 TF=[True,False,False,True] D8=D[np.ix_(TF,[2])] #提前以第2.5.1節(jié)中的TF=[True,False,False,True]邏輯列表為行索引,列數(shù)為1、3的所有元素 D9=D[np.ix_(TF,[1,3])]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
6.數(shù)組連接
# 2.6 數(shù)組連接 import numpy as np A=np.array([[1,2],[3,4]]) #定義二維數(shù)組A B=np.array([[5,6],[7,8]]) #定義二維數(shù)組B C_s=np.hstack((A,B)) #水平連接要求行數(shù)相同 C_v=np.vstack((A,B)) #垂直連接要求列數(shù)相同
1
2
3
4
5
6
7.數(shù)據(jù)的存取
# 2.7 數(shù)據(jù)存取 import numpy as np A=np.array([[1,2],[3,4]]) #定義二維數(shù)組A B=np.array([[5,6],[7,8]]) #定義二維數(shù)組B C_s=np.hstack((A,B)) #水平連接 np.save('data',C_s) import numpy as np C_s=np.load('data.npy')
1
2
3
4
5
6
7
8
9
8.求逆、解方程、特征值
# 2.10.1 創(chuàng)建Numpy矩陣 import numpy as np # 用mat則不會(huì)為矩陣創(chuàng)建副本 mat1 = np.mat("1 2 3; 4 5 6; 7 8 9") mat2 = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print("mat1: \n",mat1) print("mat2: \n",mat2) print("-"*40) import numpy as np arr1 = np.eye(3) arr2 = 3*arr1 mat = np.bmat("arr1 arr2; arr1 arr2") # 分塊矩陣,bmat嵌套矩陣 print("arr1 :\n",arr1) print("arr2 :\n",arr2) print("mat: \n",mat) print("-"*40) # 2.10.2 矩陣的屬性和基本運(yùn)算 import numpy as np mat = np.matrix(np.arange(4).reshape(2, 2)) print("mat:\n",mat) mT=mat.T # 返回自身的轉(zhuǎn)置 mH=mat.H # 返回自身的共軛轉(zhuǎn)置 mI=mat.I # 返回自身的逆矩陣 print("-"*40) import numpy as np mat1 = np.mat("1 2 3; 4 5 6; 7 8 9") mat2 = mat1*3 mat3=mat1+mat2 mat4=mat1-mat2 mat5=mat1*mat2 mat6=np.multiply(mat1, mat2) #點(diǎn)乘 print("-"*40) # 2.10.3 線(xiàn)性代數(shù)運(yùn)算 # 1.計(jì)算逆矩陣 import numpy as np mat = np.mat('1 1 1; 1 2 3; 1 3 6') inverse = np.linalg.inv(mat) print(inverse) # mat矩陣和inverse矩陣進(jìn)行點(diǎn)乘 A=np.dot(mat, inverse) print("A和A的逆矩陣點(diǎn)乘的結(jié)果:\n",A) print("-"*40) # 2.求解線(xiàn)性方程組 import numpy as np A = np.mat("1,-1,1; 2,1,0; 2,1,-1") b = np.array([4, 3, -1]) x = np.linalg.solve(A, b)#線(xiàn)性方程組Ax=b的解 print("Ax=b的解為:",x) print("-"*40) # 3.求解特征值與特征向量 import numpy as np A = np.matrix([[1, 0, 2], [0, 3, 0], [2, 0, 1]]) # A_value= np.linalg.eigvals(A) # 也可以這樣求特征值 A_value, A_vector = np.linalg.eig(A) print("A矩陣的特征值為:",A_value) print("A矩陣的特征向量為:\n",A_vector) print("-"*40)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
結(jié)果為:
mat1: [[1 2 3] [4 5 6] [7 8 9]] mat2: [[1 2 3] [4 5 6] [7 8 9]] ---------------------------------------- arr1 : [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] arr2 : [[3. 0. 0.] [0. 3. 0.] [0. 0. 3.]] mat: [[1. 0. 0. 3. 0. 0.] [0. 1. 0. 0. 3. 0.] [0. 0. 1. 0. 0. 3.] [1. 0. 0. 3. 0. 0.] [0. 1. 0. 0. 3. 0.] [0. 0. 1. 0. 0. 3.]] ---------------------------------------- mat: [[0 1] [2 3]] ---------------------------------------- ---------------------------------------- [[ 3. -3. 1.] [-3. 5. -2.] [ 1. -2. 1.]] A和A的逆矩陣點(diǎn)乘的結(jié)果: [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] ---------------------------------------- Ax=b的解為: [1. 1. 4.] ---------------------------------------- A矩陣的特征值為: [ 3. -1. 3.] A矩陣的特征向量為: [[ 0.70710678 -0.70710678 0. ] [ 0. 0. 1. ] [ 0.70710678 0.70710678 0. ]] ----------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
9.奇異值分解、計(jì)算行列式
# 4.奇異值分解 import numpy as np A = np.mat("4.0,11.0,14.0; 8.0,7.0,-2.0") U, Sigma, V = np.linalg.svd(A, full_matrices=False) # U和V是正交矩陣 print("U:",U) print("一開(kāi)始的Sigma:",Sigma) # Sigma是一維的,其元素為進(jìn)行奇異值分解的矩陣的非奇異值,可用dig生成對(duì)角矩陣 Sigma = np.diag(Sigma) print("變?yōu)閷?duì)角矩陣Sigma:\n",Sigma) print("V:",V) print("-"*40) # 5.計(jì)算矩陣行列式的值 import numpy as np A = np.mat("3,4; 5,6") A_value=np.linalg.det(A) print("A的行列式為:\n",A_value) print("-"*40)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
結(jié)果為:
U: [[ 0.9486833 -0.31622777] [ 0.31622777 0.9486833 ]] 一開(kāi)始的Sigma: [18.97366596 9.48683298] 變?yōu)閷?duì)角矩陣Sigma: [[18.97366596 0. ] [ 0. 9.48683298]] V: [[ 0.33333333 0.66666667 0.66666667] [ 0.66666667 0.33333333 -0.66666667]] ---------------------------------------- A的行列式為: -2.0000000000000004 ----------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
10.argsort函數(shù)
import numpy as np x = np.array([1, 4, 3, -1, 6, 9]) print(x.argsort()) # [3 0 2 1 4 5]
1
2
3
4
argsort()函數(shù)是將x中的元素從小到大排列,提取其對(duì)應(yīng)的index(索引),然后輸出到y(tǒng)。例如:x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以y[5]=5。
Reference
(1)numpy官方文檔
(2)【numpy】np.argsort()函數(shù)
Numpy 數(shù)據(jù)結(jié)構(gòu) 機(jī)器學(xué)習(xí)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。