NumPy学习11
今天学习了NumPy线性代数
21, NumPy线性代数
numpy_test11.py :
import numpy as np ''' 21, NumPy线性代数 NumPy 提供了 numpy.linalg 模块,该模块中包含了一些常用的线性代数计算方法, 下面对常用函数做简单介绍: NumPy线性代数函数 函数名称 描述说明 dot 两个数组的点积。 vdot 两个向量的点积。 inner 两个数组的内积。 matmul 两个数组的矩阵积。 det 计算输入矩阵的行列式。 solve 求解线性矩阵方程。 inv 计算矩阵的逆矩阵,逆矩阵与原始矩阵相乘,会得到单位矩阵。 ''' print("----21, NumPy线性代数----") ''' (1) numpy.dot() 按照矩阵的乘法规则,计算两个矩阵的点积运算结果。 当输入一维数组时返回一个结果值,若输入的多维数组则同样返回一个多维数组结果。 ''' print("----(1) numpy.dot()----") # 输入一维数组 arr_A = [1, 2, 3] arr_B = [4, 5, 6] print('np.dot(arr_A, arr_B) : ', np.dot(arr_A, arr_B)) ''' np.dot(arr_A, arr_B) : 32 ''' # 输入二维数组时 arr_a = np.array([[50, 100], [24, 12]]) print('arr_a : ', arr_a) arr_b = np.array([[10, 20], [16, 28]]) print('arr_b : ', arr_b) arr_dot = np.dot(arr_a, arr_b) print('arr_dot : ', arr_dot) ''' arr_a : [[ 50 100] [ 24 12]] arr_b : [[10 20] [16 28]] arr_dot : [ [2100 3800] [ 432 816]] ''' ''' (2) numpy.vdot() 该函数用于计算两个向量的点积结果,与 dot() 函数不同。 ''' print("----(1) numpy.dot()----") # 输入一维数组 arr_a = np.array([[50, 100], [24, 12]]) print('arr_a : ', arr_a) arr_b = np.array([[10, 20], [16, 28]]) print('arr_b : ', arr_b) arr_vdot = np.vdot(arr_a, arr_b) print('arr_vdot : ', arr_vdot) ''' arr_a : [[ 50 100] [ 24 12]] arr_b : [[10 20] [16 28]] arr_vdot : 3220 ''' ''' (3) numpy.inner() inner() 方法用于计算数组之间的内积。当计算的数组是一维数组时,它与 dot() 函数相同, 若输入的是多维数组则两者存在不同. ''' print("----(3) numpy.inner()----") arr_a = [[1, 10], [100, 1000]] print('arr_a : ', arr_a) arr_b = [[1, 2], [3, 4]] print('arr_b : ', arr_b) # inner函数 print('np.inner(arr_a, arr_b) : ', np.inner(arr_a, arr_b)) # dot函数 print('np.dot(arr_a, arr_b) : ', np.dot(arr_a, arr_b)) ''' arr_a : [[1, 10], [100, 1000]] arr_b : [[1, 2], [3, 4]] inner() 函数的计算过程是 A 数组的每一行与 B 数组的每一行相乘再相加 np.inner(arr_a, arr_b) : [[ 21 43] [2100 4300]] dot() 则表示是 A 数组每一行与 B 数组的每一列相乘。 np.dot(arr_a, arr_b) : [[ 31 42] [3100 4200]] ''' ''' (4) numpy.matmul() 该函数返回两个矩阵的乘积,假如两个矩阵的维度不一致,就会产生错误。 ''' print("----(4) numpy.matmul()----") arr_a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print('arr_a : ', arr_a) arr_b = np.array([[23, 23, 12], [2, 1, 2], [7, 8, 9]]) print('arr_b : ', arr_b) arr_mul = np.matmul(arr_a, arr_b) print('arr_mul : ', arr_mul) ''' arr_a : [[1 2 3] [4 5 6] [7 8 9]] arr_b : [[23 23 12] [ 2 1 2] [ 7 8 9]] arr_mul : [ [ 48 49 43] [144 145 112] [240 241 181]] ''' ''' (5) numpy.linalg.det() 该函数使用对角线元素来计算矩阵的行列式,计算 2*2(两行两列) 的行列式。 通过对角线元素求行列式的结果(口诀:“一撇一捺”计算法): 1*4-2*3 = -2 ''' print("----(5) numpy.linalg.det()----") arr_a = np.array([[1, 2], [3, 4]]) print('arr_a : ', arr_a) print('np.linalg.det(arr_a) : ', np.linalg.det(arr_a)) ''' arr_a : [[1 2] [3 4]] np.linalg.det(arr_a) : -2.0000000000000004 ''' ''' (6) numpy.linalg.solve() 该函数用于求解线性矩阵方程组,并以矩阵的形式表示线性方程的解,如下所示: 3X + 2 Y + Z = 10 X + Y + Z = 6 X + 2Y - Z = 2 首先将上述方程式转换为矩阵的表达形式: 方程系数矩阵: 3 2 1 1 1 1 1 2 -1 方程变量矩阵: X Y Z 方程结果矩阵: 10 6 2 如果用 m 、x、n 分别代表上述三个矩阵,其表示结果如下: m*x=n 或 x=n/m 将系数矩阵与结果矩阵传递给 numpy.solve() 函数,即可求出线程方程的解,如下所示: ''' print("----(6) numpy.linalg.solve()----") arr_m = np.array([[3, 2, 1], [1, 1, 1], [1, 2, -1]]) print('数组 arr_m : ', arr_m) arr_n = np.array([[10], [6], [2]]) print ('矩阵 arr_n:', arr_n) print ('计算:arr_m^(-1)arr_n:') arr_x = np.linalg.solve(arr_m, arr_n) print('解 arr_x : ', arr_x) ''' 数组 arr_m :[[ 3 2 1] [ 1 1 1] [ 1 2 -1]] 矩阵 arr_n: [[10] [ 6] [ 2]] 计算:arr_m^(-1)arr_n: 解 arr_x : [[1.] [2.] [3.]] ''' ''' (7) numpy.linalg.inv() 该函数用于计算矩阵的逆矩阵,逆矩阵与原矩阵相乘得到单位矩阵。 ''' print("----((7) numpy.linalg.inv()----") arr_a = np.array([[1,2],[3,4]]) print('原数组 arr_a : ', arr_a) arr_b = np.linalg.inv(arr_a) print("求逆 arr_b :", arr_b) ''' 原数组 arr_a : [[1 2] [3 4]] 求逆 arr_b : [[-2. 1. ] [ 1.5 -0.5]] '''