NumPy学习11
Posted PandaCode辉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NumPy学习11相关的知识,希望对你有一定的参考价值。
NumPy
今天学习了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]] \'\'\'
以上是关于NumPy学习11的主要内容,如果未能解决你的问题,请参考以下文章
CS231n学习笔记2. python numpy 之numpy