机器学习基础 --- numpy的基本使用
一、numpy的簡(jiǎn)介
numpy是Python的一種開(kāi)源的數(shù)值計(jì)算擴(kuò)展庫(kù)。這種工具可用來(lái)存儲(chǔ)和處理大型矩陣,比Python自身的嵌套列表(nested list structure)結(jié)構(gòu)要高效的多(該結(jié)構(gòu)也可以用來(lái)表示矩陣(matrix))。
NumPy(Numeric Python)提供了許多高級(jí)的數(shù)值編程工具,如:矩陣數(shù)據(jù)類(lèi)型、矢量處理,以及精密的運(yùn)算庫(kù)。專(zhuān)為進(jìn)行嚴(yán)格的數(shù)字處理而產(chǎn)生。
Numpy中包含了大量的矩陣運(yùn)算,所以讀者最好具有一點(diǎn)兒線(xiàn)性代數(shù)的基礎(chǔ)。
二、numpy基本使用
1.?導(dǎo)入numpy庫(kù)并使用numpy的array方法配合Python中的list生成矩陣
import numpy as npvetor = np.array([1,2,3,4]) # 一維 matrix = np.array([[1,1,1],[2,2,2],[3,3,3] ]) # 二維 print(vetor) print(matrix)輸出:
[1 2 3 4] [[1 1 1][2 2 2][3 3 3]]?
2. 獲取矩陣的組成
print(vetor.shape) print(matrix.shape)輸出:
(4,) (3, 3)?
3. 數(shù)據(jù)類(lèi)型
numbers = np.array([1,3,5,7]) # 全為int型 print(numbers) numbers.dtype輸出:
[1 3 5 7] dtype('int64') numbers = np.array([1,3,5,7.0]) # 有一個(gè)為float型,全為float型 print(numbers) numbers.dtype 示例2 [1. 3. 5. 7.] dtype('float64') 輸出2 numbers = np.array([1,3,5,'7']) # 有一個(gè)為字符串,全為字符串 print(numbers) numbers.dtype 示例3 ['1' '3' '5' '7'] dtype('<U21') 輸出3?
4.?操作矩陣的某個(gè)值,某些值
vetor = np.array([1,2,3,4]) matrix = np.array([[1,2,3],[4,5,6],[7,8,9]]) print(vetor[2]) # 打印vetor的第2個(gè)元素 print(vetor[:3]) # 打印vetor的第0到第二個(gè)(不包括第三個(gè))元素 print(matrix[2,2]) # 打印matrix第2行,第2列的元素 print(matrix[:, 1]) # 打印每一行的第1列元素輸出:
3 [1 2 3] 9 [2 5 8]?
5.?迭代判斷矩陣中的所有值是否等于某個(gè)值
import numpy as np vector = np.array([1,3,5,7]) vector == 5輸出:
array([False, False, True, False]) matrix = np.array([[1, 4, 7],[2, 5, 8],[3, 6, 9] ]) matrix == 5 示例2 array([[False, False, False],[False, True, False],[False, False, False]]) 輸出2 vector = np.array([1,3,4,5,7]) equal_three_and_five = (vector == 3) & (vector == 5) # 迭代判斷vector中的所有值是否即等于3又等于5 print(equal_three_and_five) 示例3 [False False False False False] 輸出3 vector = np.array([1,3,4,5,7]) equal_three_or_five = (vector == 3) | (vector == 5) # 迭代判斷vector中的所有值是否即等于3或者等于5 print(equal_three_or_five) 示例4 [False True False True False] 輸出4 matrix = np.array([[1, 4, 7],[2, 5, 8],[3, 6, 9] ]) equal_ten = (matrix == 5) # 比較的結(jié)果可視為一個(gè)索引 print(equal_ten) print(matrix[equal_ten]) 進(jìn)階使用1 [[False False False][False True False][False False False]] [5] 進(jìn)階輸出1 matrix = np.array([[1, 4, 7],[2, 5, 8],[3, 6, 9] ]) equal_ten = (matrix[:, 1] == 5) # 迭代判斷matrix的第1列的值是否等于5 print(equal_ten) print(matrix[equal_ten, :]) 進(jìn)階使用2 [False True False] [[2 5 8]] 進(jìn)階輸出2 vector = np.array([1,3,4,5,7]) equal_three_or_five = (vector == 3) | (vector == 5) # 迭代判斷vector中的所有值是否即等于3或者等于5 vector[equal_three_or_five] = 10 # 將等于3或者等于5的值替換成10 print(vector) 進(jìn)階使用3 [ 1 10 4 10 7] 進(jìn)階輸出3?
6.類(lèi)型轉(zhuǎn)換
vector = np.array(['1', '3', '5', '7']) print(vector.dtype) print(vector) vector = vector.astype(int) #使用astype方法做類(lèi)型轉(zhuǎn)換 print(vector.dtype) print(vector)輸出:
<U1 ['1' '3' '5' '7'] int64 [1 3 5 7]?
7.常規(guī)計(jì)算
vector = np.array([1,3,4,5,7]) print(vector.min()) #求最大值 print(vector.max()) #求最小組輸出:
1 7 # 示例2matrix = np.array([[1, 4, 7],[2, 5, 8],[3, 6, 9] ]) print(matrix.min(axis=1)) # 按行求最小值,axis=1表示按行 print(matrix.max(axis=0)) # 按列求最大值,axis=0表示按列 print(matrix.max()) # 所有值求最大值 # 輸出2 [1 2 3] [3 6 9] 9 # 示例3 matrix = np.array([[1, 4, 7],[2, 5, 8],[3, 6, 9] ]) print(matrix.sum(axis=1)) # 按行求和 print(matrix.sum(axis=0)) # 按列求和 print(matrix.sum()) # 所有值求和 # 輸出3 [12 15 18] [ 6 15 24] 45
??
8.生成初始矩陣
# 示例1 print(np.arange(15)) # 取0到14組成一個(gè)一維矩陣 a = np.arange(15).reshape(3,5) # 取0到14組成一個(gè)3行5列的2維矩陣 print(a) # 輸出1 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14] [[ 0 1 2 3 4][ 5 6 7 8 9][10 11 12 13 14]] # 示例2 a.ndim # 獲取a的維度 a.dtype.name #獲取a中數(shù)據(jù)的類(lèi)型 a.size # a中數(shù)據(jù)的數(shù)量 # 示例3 b = np.zeros((3, 4)) # 一個(gè)3行4列的矩陣, 由0構(gòu)成 print(b) # 輸出3 [[0. 0. 0. 0.][0. 0. 0. 0.][0. 0. 0. 0.]] # 示例4 c = np.ones((2,3,4), dtype=np.int32) # 3維矩陣,2組3行4列的2維矩陣,由1構(gòu)成 print(c) # 輸出4 [[[1 1 1 1][1 1 1 1][1 1 1 1]][[1 1 1 1][1 1 1 1][1 1 1 1]]] # 示例5 d = np.arange(10, 30, 5) #初值為10,增量為5,最大不超過(guò)30,構(gòu)成一維矩陣,numpy中arange的用法幾乎和Python中的range一樣 print(d) # 輸出5 [10 15 20 25] # 示例6 e = np.random.random((2, 3)) #由0到1之間的隨機(jī)數(shù)構(gòu)成一個(gè)2行3列的矩陣,np.random中的方法幾乎和Python的random模塊中的方法相同 print(e) # 輸出6 [[0.26358359 0.86922218 0.12168824][0.58244693 0.30264221 0.795065 ]] # 示例7 from numpy import pi f = np.linspace(0, 2*pi, 100) #由0到2pi中間的100個(gè)數(shù)構(gòu)成一個(gè)一維矩陣,這些書(shū)之間的增量相同 print(f) # 輸出7 [0. 0.06346652 0.12693304 0.19039955 0.25386607 0.317332590.38079911 0.44426563 0.50773215 0.57119866 0.63466518 0.69813170.76159822 0.82506474 0.88853126 0.95199777 1.01546429 1.078930811.14239733 1.20586385 1.26933037 1.33279688 1.3962634 1.459729921.52319644 1.58666296 1.65012947 1.71359599 1.77706251 1.840529031.90399555 1.96746207 2.03092858 2.0943951 2.15786162 2.221328142.28479466 2.34826118 2.41172769 2.47519421 2.53866073 2.602127252.66559377 2.72906028 2.7925268 2.85599332 2.91945984 2.982926363.04639288 3.10985939 3.17332591 3.23679243 3.30025895 3.363725473.42719199 3.4906585 3.55412502 3.61759154 3.68105806 3.744524583.8079911 3.87145761 3.93492413 3.99839065 4.06185717 4.125323694.1887902 4.25225672 4.31572324 4.37918976 4.44265628 4.50612284.56958931 4.63305583 4.69652235 4.75998887 4.82345539 4.886921914.95038842 5.01385494 5.07732146 5.14078798 5.2042545 5.267721025.33118753 5.39465405 5.45812057 5.52158709 5.58505361 5.648520125.71198664 5.77545316 5.83891968 5.9023862 5.96585272 6.029319236.09278575 6.15625227 6.21971879 6.28318531]?
9.矩陣的基礎(chǔ)運(yùn)算
# 示例2 # 矩陣的加減運(yùn)算 a = np.array([20, 30, 40, 50]) b = np.arange(4) print(a) print(b) c = a - b # 將a與b對(duì)應(yīng)的位置相減 d = a + b # 將a與b對(duì)應(yīng)的位置相加 print('----------->') print(c) print(d) c = c -2 print('----------->') print(c) print(b ** 2) # 對(duì)b中的每個(gè)元素平方 print(a < 40) # 迭代判斷a中的元素是否小于40 #輸出1 [20 30 40 50] [0 1 2 3] -----------> [20 29 38 47] [20 31 42 53] -----------> [18 27 36 45] [0 1 4 9] [ True True False False] # 示例2 # 矩陣的乘法 A = np.array([[1, 1],[0, 1] ]) B = np.array([[2, 0],[3, 4] ]) print(A) print("=============") print(B) print("=============") print(A*B) # 矩陣對(duì)應(yīng)位置的元素相乘 print("=============") print(A.dot(B)) # 矩陣乘積 print("=============") print(np.dot(A, B)) # 矩陣乘積 # 輸出2 [[1 1][0 1]] ============= [[2 0][3 4]] ============= [[2 0][0 4]] ============= [[5 4][3 4]] ============= [[5 4][3 4]]?
10.矩陣的其他操作
# 示例1 import numpy as np B = np.arange(3) print(B) print(np.exp(B)) # 分別計(jì)算e的0,1,2(即B中的每個(gè)元素)次冪 print(np.sqrt(B)) # 對(duì)B求算數(shù)平方根# 輸出1: [0 1 2] [1. 2.71828183 7.3890561 ] [0. 1. 1.41421356] # 示例2 a = np.random.random((3, 4)) print(a) b = np.floor(10 * a) #取整,截除小數(shù)點(diǎn)后面的部分 print(b) print("------------------------------>") c = b.ravel() # 二維轉(zhuǎn)一維,即矩陣轉(zhuǎn)向量,返回一個(gè)新的矩陣,自身結(jié)構(gòu)不改變 print(c) c.shape = (6, 2) # 一維轉(zhuǎn)二維,向量轉(zhuǎn)為6×2的矩陣,對(duì)自己自身結(jié)構(gòu) print(c) print("------------------------------>") d = c.T print(c.T) # 對(duì)矩陣進(jìn)行轉(zhuǎn)置# 輸出2: [[0.07997894 0.66199346 0.66872968 0.09003685][0.80189354 0.02278636 0.82955998 0.3037011 ][0.31794432 0.67269324 0.12022113 0.12148777]] [[0. 6. 6. 0.][8. 0. 8. 3.][3. 6. 1. 1.]] ------------------------------> [0. 6. 6. 0. 8. 0. 8. 3. 3. 6. 1. 1.] [[0. 6.][6. 0.][8. 0.][8. 3.][3. 6.][1. 1.]] ------------------------------> [[0. 6. 8. 8. 3. 1.][6. 0. 0. 3. 6. 1.]] # 示例3 import numpy as np a = np.floor(10 * np.random.random((2, 2))) b = np.floor(10 * np.random.random((2, 2))) print(a) print(b) print("------------------------------>") c = np.vstack((a, b)) # 將兩個(gè)矩陣按行合并,兩個(gè)矩陣的列必須相同 print(c) print("------------------------------>") d = np.hstack((a, b)) # 兩個(gè)矩陣按列合并,兩個(gè)矩陣的行必須相同 print(d)# 輸出3: [[8. 7.][0. 0.]] [[6. 9.][0. 1.]] ------------------------------> [[8. 7.][0. 0.][6. 9.][0. 1.]] ------------------------------> [[8. 7. 6. 9.][0. 0. 0. 1.]] # 示例4 import numpy as np a = np.floor(10 * np.random.random((2, 12))) print(a) print("------------------------------>") b,c,d = np.hsplit(a, 3) # 按列切平均分為3份 print(b) print(c) print(d) print("------------------------------>") e,f,g = np.vsplit(a.T, 3) # 按行切平均分為3份 print(e) print(f) print(g) print("------------------------------>") h, i, j, k = np.hsplit(a, (3, 6, 8)) # 在第3列前面,第6列前面,第8列后面進(jìn)行分割,分割為4個(gè)矩陣,np.vsplit()用法相同 print(h) print(i) print(j) print(k)# 輸出4: [[3. 1. 7. 4. 1. 1. 5. 8. 3. 9. 5. 6.][2. 7. 6. 3. 7. 1. 6. 3. 5. 7. 9. 0.]] ------------------------------> [[3. 1. 7. 4.][2. 7. 6. 3.]] [[1. 1. 5. 8.][7. 1. 6. 3.]] [[3. 9. 5. 6.][5. 7. 9. 0.]] ------------------------------> [[3. 2.][1. 7.][7. 6.][4. 3.]] [[1. 7.][1. 1.][5. 6.][8. 3.]] [[3. 5.][9. 7.][5. 9.][6. 0.]] ------------------------------> [[3. 1. 7.][2. 7. 6.]] [[4. 1. 1.][3. 7. 1.]] [[5. 8.][6. 3.]] [[3. 9. 5. 6.][5. 7. 9. 0.]]?
11.矩陣的復(fù)制
# 示例1 a = np.arange(12) b = a # 這種方式對(duì)b賦值,b和a是同一個(gè)對(duì)象,改變一個(gè),另一個(gè)也改變,相當(dāng)于別名 print(b) print(a) print(b is a) print("------------------------------>") a.shape = (3, 4) print(a) print(b) print(b.shape) print(id(a)) print(id(b))輸出1: [ 0 1 2 3 4 5 6 7 8 9 10 11] [ 0 1 2 3 4 5 6 7 8 9 10 11] True ------------------------------> [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]] [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]] (3, 4) 4426322848 4426322848 # 示例2 # 淺拷貝(不建議使用) a = np.arange(12) a.shape = (2, 6) c = a.view() # 淺拷貝,c和a是兩個(gè)對(duì)象,但是是同一份數(shù)據(jù) print(a) print(c) print(c is a) print("------------------------------>") a.shape = (3, 4) # 改變結(jié)構(gòu),兩個(gè)不相互影響 print(a) print(c) print("------------------------------>") c[0,4] = 10000 # 改變數(shù)據(jù),會(huì)影響另外一個(gè) print(a) print(c)# 輸出2: [[ 0 1 2 3 4 5][ 6 7 8 9 10 11]] [[ 0 1 2 3 4 5][ 6 7 8 9 10 11]] False ------------------------------> [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]] [[ 0 1 2 3 4 5][ 6 7 8 9 10 11]] ------------------------------> [[ 0 1 2 3][10000 5 6 7][ 8 9 10 11]] [[ 0 1 2 3 10000 5][ 6 7 8 9 10 11]] # 示例3 # 深拷貝 a = np.arange(12) a.shape = (2, 6) d = a.copy() # 深拷貝,d和a是兩個(gè)對(duì)象,兩份數(shù)據(jù) print(a) print(d) print(d is a) print("------------------------------>") a.shape = (3, 4) # 改變結(jié)構(gòu),兩個(gè)不相互影響 print(a) print(d) print("------------------------------>") d[0,4] = 10000 # 改變數(shù)據(jù),兩個(gè)不相互影響 print(a) print(d)# 輸出3: [[ 0 1 2 3 4 5][ 6 7 8 9 10 11]] [[ 0 1 2 3 4 5][ 6 7 8 9 10 11]] False ------------------------------> [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]] [[ 0 1 2 3 4 5][ 6 7 8 9 10 11]] ------------------------------> [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]] [[ 0 1 2 3 10000 5][ 6 7 8 9 10 11]]?
12.numpy的一些常用方法:
# 示例1 import numpy as np data = np.sin(np.arange(20)).reshape(5, 4) print(data) ind = data.argmax(axis = 0) # 按列求最大值,得到行的索引,比如第1列的最大值在第2行,則返回2,依次求出所有列最大值的索引組成一個(gè)向量 print(ind) print(range(data.shape[1])) data_max = data[ind, range(data.shape[1])] # 相當(dāng)于由data[2,0],data[0,1],data[3,2],data[1,3]構(gòu)成的一個(gè)矩陣 print(data_max)# 輸出1: [[ 0. 0.84147098 0.90929743 0.14112001][-0.7568025 -0.95892427 -0.2794155 0.6569866 ][ 0.98935825 0.41211849 -0.54402111 -0.99999021][-0.53657292 0.42016704 0.99060736 0.65028784][-0.28790332 -0.96139749 -0.75098725 0.14987721]] [2 0 3 1] range(0, 4) [0.98935825 0.84147098 0.99060736 0.6569866 ] # 示例2 a = np.arange(0, 10, 2) print(a) b = np.tile(a, (4, 3)) # 將a當(dāng)成一個(gè)整體,將其復(fù)制為4行3列構(gòu)成一個(gè)矩陣 print(b) print('----------------------------------->') c = np.arange(0, 11, 2) c.shape = (2, 3) # 對(duì)于二維同樣如此 print(c) d = np.tile(c, (4, 3)) print(d)# 輸出2: [0 2 4 6 8] [[0 2 4 6 8 0 2 4 6 8 0 2 4 6 8][0 2 4 6 8 0 2 4 6 8 0 2 4 6 8][0 2 4 6 8 0 2 4 6 8 0 2 4 6 8][0 2 4 6 8 0 2 4 6 8 0 2 4 6 8]] -----------------------------------> [[ 0 2 4][ 6 8 10]] [[ 0 2 4 0 2 4 0 2 4][ 6 8 10 6 8 10 6 8 10][ 0 2 4 0 2 4 0 2 4][ 6 8 10 6 8 10 6 8 10][ 0 2 4 0 2 4 0 2 4][ 6 8 10 6 8 10 6 8 10][ 0 2 4 0 2 4 0 2 4][ 6 8 10 6 8 10 6 8 10]] # 示例3 a = np.floor(10 * np.random.random((15))) c = a.copy() a.shape = (5, 3) print(a) print('----------------------------------->') b = np.sort(a, axis=0) # axis=0按列進(jìn)行升序排序, axis=1按行升序排序, 默認(rèn)按行排序 print(b) print('----------------------------------->') a.sort(axis=1) print(a) print('----------------------------------->') j = np.argsort(c) # 排序,取原來(lái)的索引,比如[5 3 6]執(zhí)行,得到[1 0 2], print(c) print(j) print(c[j])# 輸出3: [[2. 5. 5.][6. 4. 9.][8. 3. 0.][2. 3. 0.][5. 5. 4.]] -----------------------------------> [[2. 3. 0.][2. 3. 0.][5. 4. 4.][6. 5. 5.][8. 5. 9.]] -----------------------------------> [[2. 5. 5.][4. 6. 9.][0. 3. 8.][0. 2. 3.][4. 5. 5.]] -----------------------------------> [2. 5. 5. 6. 4. 9. 8. 3. 0. 2. 3. 0. 5. 5. 4.] [ 8 11 0 9 7 10 4 14 1 2 12 13 3 6 5] [0. 0. 2. 2. 3. 3. 4. 4. 5. 5. 5. 5. 6. 8. 9.]?
轉(zhuǎn)載于:https://www.cnblogs.com/God-Li/p/8830327.html
總結(jié)
以上是生活随笔為你收集整理的机器学习基础 --- numpy的基本使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 12.源码阅读(app启动流程-andr
- 下一篇: 免费OA系统品牌有那些?