客户端码农学习ML —— Numpy基本用法
本文從創建矩陣、維度變換、矩陣運算、隨機數、索引等方面總結numpy中基本用法,腳本首先import numpy as np。
創建矩陣
np.array([1, 2, 3])輸出 [1 2 3] np.array([(1, 2, 3), (4, 5, 6)], dtype=np.int32)指定類型int32,輸出 [[1 2 3][4 5 6]] np.zeros((2, 3)) np.ones((2, 3), dtype=int) np.eye(3)創建全為0、全為1的矩陣,以及單位矩陣 np.arange(12)輸出[0, 12),[ 0 1 2 3 4 5 6 7 8 9 10 11]np.arange(1, 2, 0.3)1開頭 差值為0.3的等差數列,直到小于2 輸出 [ 1. 1.3 1.6 1.9] np.linspace(1, 2, 11)1開頭 2最后,中間11的數字平分,輸出:[ 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2. ]首先定義a、b兩個矩陣
A = np.array([[1, 2, 3], [4, 5, 6]]) B = np.array([[2, 1, 0], [1, 1, 1]])維度變換
shape重定義
A = np.arange(1, 7).reshape(2, 3)上述矩陣a還可以通過reshape改變1維數組為2行3列 [[1 2 3][4 5 6]]矩陣轉置
C = A.T C = A.transpose()原先2行3列的矩陣變成了3行2列 [[1 4][2 5][3 6]]逆矩陣(必須是方陣,即行、列的維度相等,同時det(D) != 0)
D = np.mat("1 2 3; 2 3 1; 3 1 2")D.I[[-0.27777778 0.05555556 0.38888889][ 0.05555556 0.38888889 -0.27777778][ 0.38888889 -0.27777778 0.05555556]]np.dot(D, D.I) = np.dot(D.I, D) = I水平組合: 要求橫軸即1維上的數量相同
np.hstack((A, B))[[1 2 3 2 1 0][4 5 6 1 1 1]]垂直組合: 要求縱軸即0維上的數量相同
np.vstack((A, B))[[1 2 3][4 5 6][2 1 0][1 1 1]]水平拆分
np.hsplit(A, 3)[array([[1],[4]]), array([[2],[5]]),array([[3],[6]])]垂直拆分
np.vsplit(A, 2)[array([[1, 2, 3]]), array([[4, 5, 6]])]矩陣運算
矩陣與標量的加減乘除等于矩陣內各元素與標量的加減乘除
A + 1[[2 3 4][5 6 7]]A * 2 [[ 2 4 6][ 8 10 12]]矩陣與矩陣相加,各維度必須一致,相同位置的元素相加,否則報錯
A + B[[3 3 3][5 6 7]]用dot方法相乘,表示線性代數里的向量內積(也叫點積、數量積)或矩陣乘法
要注意向量內積滿足交換律但不滿足結合律,相乘的結果是一個數。
而矩陣乘法滿足結合律但不滿足交換律,相乘的結果還是一個矩陣。
np.dot(A, C)[[14 32][32 77]]但是當秩為1時,也是對應位置元素相乘并累加。用multiply相乘,維度也必須一致,相同位置的元素相乘
np.multiply(A, B)[[2 2 0][4 5 6]]A, B創建后的類型是type(A) = 'numpy.ndarray', 如果顯式轉換成matrix類型,那么*跟dot含義一致,否則跟multiply一致。通過np.mat(A)轉換為'numpy.matrixlib.defmatrix.matrix'。
A * B[[2 2 0][4 5 6]] np.mat(A) * np.mat(C)[[14 32][32 77]]用向量試試:
M = np.array([1, 2, 3]) N = np.array([1, 0, 2]) print('\nM = %s N = %s type(M)=%s' % (M, N, type(M)))DOT_MN = np.dot(M, N) print('dot(M,N)=%s type=%s' % (DOT_MN, type(DOT_MN)))DOT_MAT_MN = np.dot(np.mat(M), np.mat(N).T) print('dot(mat(M), mat(N).T)=%s type=%s' % (DOT_MAT_MN, type(DOT_MAT_MN)))輸出如下: M = [1 2 3] N = [1 0 2] type(M)=<class 'numpy.ndarray'> dot(M,N)=7 type=<class 'numpy.int64'> dot(mat(M), mat(N).T)=[[7]] type=<class 'numpy.matrixlib.defmatrix.matrix'>總結下來,即:
multiply始終是數乘,相同位置元素相乘
dot始終是向量內積或者矩陣乘法,經試驗 A @ C 結果等同于 dot
而*根據數據類型決定如何乘
隨機數
np.random.random((2, 3))生成[0,1)之間的浮點數 [[ 0.96702984 0.54723225 0.97268436][ 0.71481599 0.69772882 0.2160895 ]]從python源碼的注釋看,ranf = random = sample = random_sample np.random.rand(2, 4)[[ 0.97627445 0.00623026 0.25298236 0.43479153][ 0.77938292 0.19768507 0.86299324 0.98340068]]同樣生成生成[0,1)之間的浮點數,與random的具體區別不是很清楚,從注釋上看rand屬于uniform distribution,random屬于continuous uniform np.random.randn(2, 4)生成標準正態分布樣本 0為均值、1為標準差 N(0,1) [[ 0.33225003 -1.14747663 0.61866969][-0.08798693 0.4250724 0.33225315]] np.random.normal(10, 1, (2, 6))生成均值為loc,標準差為scale的正態分布矩陣,numpy中很多方法如果size不寫則返回一個值 [[ 9.43149964 9.05681477 10.55712148 9.97022176 10.41476467][ 10.35518302 10.35732679 9.05575841 12.32206439 10.31706671]] np.random.randint(10, 20, size=(2, 5))生成[10, 20)之間的隨機整數 [[11 10 13 12 13][12 19 12 11 10]] np.random.choice(10, 5, False)從[0, 10)選5個不重復的數: [9 6 8 7 5]list = ['a', 'b', 'c', 'd', 'e'] np.random.choice(list, size=(3, 4), replace=True)從另一個數組中選擇可重復值 [['c' 'b' 'c' 'd']['a' 'e' 'd' 'd']]索引與切片
對于一維數組
x = [0 1 2 3 4 5 6 7 8 9]
x[2] : 1 x[2:5] : [2 3 4]甚至還可以用數組當索引 indexs = [2, 3, 4] (x * 2)[indexs]輸出[4, 6, 8]x[::-1] x[::-2] 如果第二個冒號后是負數,則數組反轉,非-1則類似正數間隔篩選: x[::-1] = [9 8 7 6 5 4 3 2 1 0] x[::-2] = [9 7 5 3 1]對于多維矩陣,每個維度之間用,分隔開,單獨用類似于一維數組的方式指定索引
print('A[1] = %s\n' % A[1]) print('A[1, :] = %s\n' % A[1, :]) print('A[:, 1] = %s\n' % A[:, 1]) print('A[1:3, 1:3] = %s\n' % A[1:3, 1:3])A[1] = [4 5 6] A[1, :] = [4 5 6] A[:, 1] = [2 5] A[1:3, 1:3] = [[5 6]]Boolean Arrays
X = np.arange(12).reshape(3,4) X = X > 4[[False False False False][False True True True][ True True True True]]X.any() : 是否有True? True X.all() : 是否都是True? False矩陣自身屬性
A.ndim A.shape A.size A.dtype A.itemsize
分別表示:矩陣維數、各維度具體大小、元素總數、元素類型、此類型占用字節數
輸出分別是:2 (2, 3) 6 int64 8
其它操作
求和、最大、最小值、平均值、方差、標準差
A.sum(), A.min(), A.max(), A.mean(), A.var(), A.std()sum=21 min=1 max=6 mean=3.5 var=2.9167 std=1.7078提取矩陣對角: 如果原來是1維矩陣則轉為對角矩陣,否則提取對角線返回1維矩陣
np.diag(A)[1 5]np.diag(np.diag(A))[[1 0][0 5]]總結
很強大的矩陣操作庫,其它還有大量功能待后續繼續了解,如concatenate、dstack、column_stack、split、sina、sqrt、cumsum、fromfunction、floor、resize、where等等,還可以通過save、load、savetxt、loadtxt等進行文件讀寫。
參考
http://qianhk.com/2018/03/客戶端碼農學習ML-Numpy基本用法/
https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
http://blog.csdn.net/zenghaitao0128/article/details/78715140
http://codingpy.com/article/an-introduction-to-numpy/
本文首發于錢凱凱的博客
?
總結
以上是生活随笔為你收集整理的客户端码农学习ML —— Numpy基本用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【小松教你手游开发】【面试必读(编程基础
- 下一篇: js 如何实现bind