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的主要内容,如果未能解决你的问题,请参考以下文章

Numpy的学习5-array的分割

numpy学习笔记

CS231n学习笔记2. python numpy 之numpy

11.24学习

Numpy的学习6-深浅赋值(copy&deep copy)

Python_Example_ NumPy 学习/示例