这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习中python常用的这些库有更深入的理解,在应用中也能更为熟练。
以下是根据书上的代码进行实操,注释基本写明了每句代码的作用(写在本句代码之前)和print的输出结果(写在print之后)。不一定严格按照书上内容进行,根据代码运行时具体情况稍作顺序调整,也加入了一些自己的理解。
如果复制到自己的环境下跑一遍输出,相信理解会更深刻更清楚。
博客中每个代码块代表一次完整的运行结果,可以直接以此为单位复制并运行。
本节主要是numpy库的基本应用。
包括:
import numpy as np # 创建一个行向量 vector = np.array([1,2,3]) # 创建一个列向量 vector = np.array([[1],[2],[3]]) print(vector) # 创建一个矩阵 matrix = np.array([[0,0],[2,0],[0,3]]) print(type(matrix)) #<class 'numpy.ndarray'> # 查看行数和列数 print(matrix.shape) #(3, 2) # 查看元素数量 print(matrix.size) #6 # 查看维数 print(matrix.ndim) #2 # 转换为矩阵格式mat matrix = np.mat(matrix) print(type(matrix)) #<class 'numpy.matrix'> from scipy import sparse # 转换为压缩的稀疏行矩阵 matrix = sparse.csr_matrix(matrix) print(matrix) # (1, 0) 2 # (2, 1) 3 print(type(matrix)) #<class 'scipy.sparse.csr.csr_matrix'>
import numpy as np matrix = np.array([[1,2,3],[4,5,6],[7,8,9]]) # 输出矩阵第二行第三列的元素(下标从0开始) # 注意此处下标与二维list不同 print(matrix[1,2]) # 6 # 一维切片,[起始位置:结束位置],包括起始位置,不包括结束位置元素 # 输出第三个元素之前所有元素 vector = np.array([1,2,3]) print(vector[0:2]) # [1 2] # 二维切片,与一维类似[起始位置:结束位置],不同维度用','隔开 # '1:'第二行及之后所有行 # ':2'第三列之前所有列 print(matrix[1:,:2]) # [[4 5] # [7 8]] # 对一个数组中多个元素同时应用某个函数 # 创建一个函数,add_100返回:输入值+100的值 add_100 = lambda i : i + 100 # 创建向量化函数 vectorized_add_100 = np.vectorize(add_100) # 对矩阵所有元素应用这个函数 vectorized_add_100(matrix) print(matrix) # [[1 2 3] # [4 5 6] # [7 8 9]]
import numpy as np matrix = np.array([[1,2,3],[4,5,6],[7,8,9]]) # 求矩阵中最大的元素 print(np.max(matrix)) # 9 # 求矩阵中最小的元素 print(np.min(matrix)) # 1 # 求每列最大的元素,axis指维度 print(np.max(matrix, axis = 0)) # [7 8 9] # 求每行最大的元素 print(np.max(matrix, axis = 1)) # [3 6 9] # 计算矩阵的平均值 print(np.mean(matrix)) # 5.0 print(type(np.mean(matrix))) # <class 'numpy.float64'> # 计算矩阵的方差 print(np.var(matrix)) # 6.666666666666667 print(type(np.var(matrix))) # <class 'numpy.float64'> # 计算矩阵的标准差 print(np.std(matrix)) # 2.581988897471611 print(type(np.std(matrix))) # <class 'numpy.float64'> # 以上计算均可以加参数axis求每行或每列 # 求每行的平均值 print(np.mean(matrix, axis = 1)) # [2. 5. 8.]
import numpy as np matrix = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) # 矩阵变形,不改变元素值,改变矩阵的形状 # 将矩阵从4*3变为2*6 print(matrix.shape) # (4, 3) matrix = matrix.reshape(2,6) print(matrix.shape) # (2, 6) print(matrix) # [[ 1 2 3 4 5 6] # [ 7 8 9 10 11 12]] # 也可以将其中一个维度设为默认'-1',会自己取整除之后的数作为默认维度 matrix = matrix.reshape(3,-1) print(matrix.shape) # (3, 4) print(matrix) # [[ 1 2 3 4] # [ 5 6 7 8] # [ 9 10 11 12]] # 以下三种情况注意区别: # 情况1 matrix = matrix.reshape(1,-1) print(matrix.shape) # (1, 12) print(matrix) # [[ 1 2 3 4 5 6 7 8 9 10 11 12]] # 情况2 matrix = matrix.reshape(3,-1) print(matrix.shape) # (3, 4) matrix = matrix.reshape(matrix.size) print(matrix.shape) # (12,) print(matrix) # [ 1 2 3 4 5 6 7 8 9 10 11 12] # 情况3 # 展开矩阵 matrix = matrix.reshape(3,-1) print(matrix.shape) # (3, 4) matrix = matrix.flatten() print(matrix.shape) # (12,) print(matrix) # [ 1 7 2 8 3 9 4 10 5 11 6 12] # 矩阵转置 matrix = matrix.reshape(2,6) print(matrix.shape) # (2, 6) print(matrix) # [[ 1 2 3 4 5 6] # [ 7 8 9 10 11 12]] matrix = matrix.T print(matrix.shape) # (6, 2) print(matrix) # [[ 1 7] # [ 2 8] # [ 3 9] # [ 4 10] # [ 5 11] # [ 6 12]]
import numpy as np matrix = np.array([[1,1,3],[2,2,6],[3,3,9]]) print(matrix) # [[1 1 3] # [2 2 6] # [3 3 9]] # 矩阵的秩 r(A) print(np.linalg.matrix_rank(matrix)) # 1 # 矩阵的行列式 det(A)或|A| print(np.linalg.det(matrix)) # 0.0 # 矩阵的对角线元素 tr(A) print(np.diagonal(matrix)) # [1 2 9] # 可以引入参数offset对主对角线上下偏移 # 向上偏移 print(np.diagonal(matrix, offset = 1)) # [1 6] # 向下偏移 print(np.diagonal(matrix, offset = -1)) # [2 3] # 矩阵的迹 tr(A),即对角线元素之和 print(np.trace(matrix)) # 12 # 同样可以对主对角线进行偏移 print(np.trace(matrix, offset = 1)) # 7 matrix = np.array([[-2,1,1],[0,2,0],[-4,1,3]]) # 矩阵的特征值和特征向量 eigen_values, eigen_vectors = np.linalg.eig(matrix) # 特征值 print(eigen_values) # [-1. 2. 2.] # 特征向量 print(eigen_vectors) # [[-0.70710678 -0.24253563 0.30151134] # [ 0. 0. 0.90453403] # [-0.70710678 -0.9701425 0.30151134]]
import numpy as np mat_1 = np.array([[1,1,2],[1,1,2],[1,1,2]]) mat_2 = np.array([[1,2,1],[1,2,1],[1,2,1]]) # 矩阵相加 print(np.add(mat_1, mat_2)) # [[2 3 3] # [2 3 3] # [2 3 3]] print(mat_1 + mat_2) # [[2 3 3] # [2 3 3] # [2 3 3]] # 矩阵相减 print(np.subtract(mat_1, mat_2)) # [[ 0 -1 1] # [ 0 -1 1] # [ 0 -1 1]] print(mat_1 - mat_2) # [[ 0 -1 1] # [ 0 -1 1] # [ 0 -1 1]] # 矩阵乘法 print(np.dot(mat_1, mat_2)) # [[4 8 4] # [4 8 4] # [4 8 4]] print(mat_1 @ mat_2) # [[4 8 4] # [4 8 4] # [4 8 4]] # 矩阵对应元素相乘 print(mat_1 * mat_2) # [[1 2 2] # [1 2 2] # [1 2 2]] # 矩阵的逆 A-1 mat = np.array([[0,1],[1,0]]) print(np.linalg.inv(mat)) # [[0. 1.] # [1. 0.]] # 验证:A*(A-1) = I print(mat @ np.linalg.inv(mat)) # [[1. 0.] # [0. 1.]]
import numpy as np # 设计随机数种子 np.random.seed(0) # 生成3个0.0到1.0之间的随机数 rand = np.random.random(3) print(rand) # [0.5488135 0.71518937 0.60276338] # 生成3个1到10之间的随机整数 rand = np.random.randint(0, 11, 3) print(rand) # [3 7 9] # 从均值为0,标准差为1的正态分布中抽取3个数 rand = np.random.normal(0, 1, 3) print(rand) # [-1.42232584 1.52006949 -0.29139398] # 从均值为0,散布程度为1的logistic分布中抽取3个数 rand = np.random.logistic(0, 1, 3) print(rand) # [-0.98118713 -0.08939902 1.46416405] # 从大于等于1,小于2的范围中抽取3个数 rand = np.random.uniform(1, 2, 3) print(rand) # [1.47997717 1.3927848 1.83607876]