当你知道工具的用处,理论与工具如何结合的时候,通常会加速咱们对两者的学习效率。

零 numpy

那么,Numpy是什么?

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量维度的数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。 ---- 摘自 · 菜鸟教程

一 要点

  • 假定AX=b,求解未知矩阵X 【线性代数中常遇到的运算问题】
  • 矩阵转置A^(T)
  • 矩阵的逆A^(-1)
  • 矩阵行列式的值|A|
  • 矩阵的秩 rank(A)
  • 矩阵的迹 trace(A)
  • 其它
    • 单位矩阵
    • 0向量/矩阵
    • ...

二 示例应用

2.1 求解AX=b中的未知参数矩阵X

  1. import numpy as np
  2. # Hypothsis : A*X = b
  3. A = [[2,1,2],
  4. [3,1,0],
  5. [1,1,-1]];
  6. b = np.transpose([-3,5,-2])# 转置
  7. #[or] b = np.transpose(np.array([-3,5,-2]))# 转置
  8. # 求解未知参数矩阵X
  9. X = np.linalg.solve(A,b) # 方式一:直接使用numpy的solve函数一键求解
  10. #A_inv=np.linalg.inv(A) # 方式二:先求逆运算,再点积求值
  11. #X=np.dot(A_inv,b) # a.dot(b) 与 np.dot(a,b) 效果相同;but np.dot(a,b)与np.dot(b,a)效果肯定是不同的(线性代数/矩阵常识)
  12. print("方程组的解:\n",X);
  1. # [output]
  2. 方程组的解:
  3. [ 4.4 -8.2 -1.8]

2.2 利用最小二乘法拟合函数模型

给出一组数据【5对(Xi,Yi)参数】,用最小二乘法,求形如:f(x)=a+b*x^3的经验公式。

  • 原方程(模型)

\[f(x) = a + bx^3
\]

  • 其法方程

\[A^T A \begin{pmatrix} a \\ b \\ \end{pmatrix} = A^T y
\]

\[\begin{pmatrix} a \\ b \\ \end{pmatrix} = \left( A^T A \right)^{-1} A^T y
\]

  1. import numpy as np
  2. import matplotlib.pyplot as plt # Python 绘图工具(业界推荐)
  3. # 数据初始化
  4. A = [
  5. [1,pow(-3,3)],
  6. [1,pow(-2,3)],
  7. [1,pow(-1,3)],
  8. [1,pow(2,3)],
  9. [1,pow(4,3)]
  10. ];
  11. At = np.transpose(A); # A的转置矩阵
  12. y = np.transpose([14.3,8.3,4.7,8.3,22.7]);
  13. # step1:求解
  14. ## 令 (a ,b)^T 为 未知参数X
  15. X = np.dot(np.dot(np.linalg.inv(np.dot(At,A)),At),y)
  16. print(X)
  17. print("a:",X[0])
  18. print("b:",X[1])
  19. # step2:查看拟合效果
  20. x = [-3,-2,-1,2,4];
  21. ## 1. 计算拟合数值 fitValue
  22. def fitValue(arg_x):
  23. a = X[0];
  24. b = X[1];
  25. return a + b*pow(arg_x,3);
  26. fitValues = np.zeros([5]); # 创建长为5的【一维】数组;[1,5]:创建第1行为5个元素的【二维】数组
  27. for i in range(0,len(fitValues)):
  28. fitValues[i] = fitValue(x[i]);
  29. print(i,":","x(i):",x[i],"fit Y:",fitValues[i]); # just for test
  30. pass;
  31. ## 2. 绘图可视化
  32. yt = np.transpose(y); # y的转置
  33. plt.rcParams['figure.dpi'] = 100 #分辨率
  34. plt.scatter(x, yt, marker = '*',color = 'red', s = 10 ,label = 'Actual Dataset') # 真实数据集
  35. plt.scatter(x, fitValues, marker = 'x',color = 'green', s = 10 ,label = 'Fitting Dataset') #[拟合数据集]
  36. plt.legend(loc = 'best') # 设置 图例所在的位置 使用推荐位置
  37. plt.show()
  38. # [output]
  39. [ 10.67505325 0.13679816]
  40. a: 10.6750532504
  41. b: 0.136798159666
  42. 0 : x(i): -3 fit Y: 6.98150293942
  43. 1 : x(i): -2 fit Y: 9.58066797308
  44. 2 : x(i): -1 fit Y: 10.5382550907
  45. 3 : x(i): 2 fit Y: 11.7694385277
  46. 4 : x(i): 4 fit Y: 19.430135469

2.3 数组创建/初始化

  • numpy.linspace(start, stop[, num=50[, endpoint=True[, retstep=False[, dtype=None]]]]])

    • 一维等差数列
    • return 在指定范围内的均匀间隔的数字(组成的数组),也即返回一个等差数列
    • 参数
      • start - 起始点
      • stop - 结束点
      • num - 元素个数,默认为50,
      • endpoint - 是否包含stop数值,默认为True,包含stop值;若为False,则不包含stop值
      • retstep - 返回值形式,默认为False,返回等差数列组,若为True,则返回结果(array([samples, step])),
      • dtype - 返回结果的数据类型,默认无,若无,则参考输入数据类型。
  1. import numpy as np
  2. a = np.linspace(1,10,5,endpoint= True)
  3. print(a) # [ 1. 3.25 5.5 7.75 10. ]
  4. b = np.linspace(1,10,5,endpoint= False)
  5. print(b) #[1. 2.8 4.6 6.4 8.2]
  6. c = np.linspace(1,10,5,retstep = False)
  7. print(c) # [ 1. 3.25 5.5 7.75 10. ]
  8. d = np.linspace(1,10,5,retstep = True)
  9. print(d) # (array([ 1. , 3.25, 5.5 , 7.75, 10. ]), 2.25)

2.4 线性代数常用运算


  1. print("原矩阵A:\n",A);
  2. print("原矩阵b:\n",b);
  3. print("转置矩阵A^T:\n",np.transpose(A)); # 转置
  4. print("矩阵的行列式值|A|:\n",np.linalg.det(A)); # 方阵的行列式值:|A|
  5. print("矩阵的迹trace(A):\n",np.trace(A));
  6. print("矩阵的秩rank(A):\n",np.linalg.matrix_rank(A));
  7. print("逆矩阵A^(-1):\n",np.linalg.inv(A)); #矩阵的逆运算(条件:矩阵A可逆(行列式值不为0)| 矩阵A为方阵)
  8. print("*"*30); # 分隔线
  9. print("N阶单位矩阵:\n",np.eye(4));
  10. print(np.zeros([5])); # 创建长为5的【一维】数组;[1,5]:创建第1行为5个元素的【二维】数组
  11. # 创建指定的初始化数组
  12. print(np.array([1])) # 生成 第1行含值为1的元素的【一维】数组
  13. print(np.array([[56]])) # 生成 第1行含值为56的元素的【二维】数组
  14. np.full((3,5),3.14) # 创建一个3x5的浮点型数组,数组的值都是3.14
  1. # [output]
  2. 原矩阵A
  3. [[2, 1, 2], [3, 1, 0], [1, 1, -1]]
  4. 原矩阵b
  5. [-3 5 -2]
  6. 转置矩阵A^T
  7. [[ 2 3 1]
  8. [ 1 1 1]
  9. [ 2 0 -1]]
  10. 矩阵的行列式值|A|:
  11. 5.0
  12. 矩阵的迹trace(A):
  13. 2
  14. 矩阵的秩rank(A):
  15. 3
  16. 逆矩阵A^(-1):
  17. [[-0.2 0.6 -0.4]
  18. [ 0.6 -0.8 1.2]
  19. [ 0.4 -0.2 -0.2]]
  20. **********************
  21. N阶单位矩阵:
  22. [[ 1. 0. 0. 0.]
  23. [ 0. 1. 0. 0.]
  24. [ 0. 0. 1. 0.]
  25. [ 0. 0. 0. 1.]]
  26. [ 0. 0. 0. 0. 0.]
  27. [1]
  28. [[56]]

三 推荐文献

Python之Numpy:线性代数/矩阵运算的更多相关文章

  1. [转]numpy线性代数基础 - Python和MATLAB矩阵处理的不同

    转自:http://blog.csdn.net/pipisorry/article/details/45563695 http://blog.csdn.net/pipisorry/article/de ...

  2. python中numpy矩阵运算操作大全(非常全)!

    python中numpy矩阵运算操作大全(非常全) //2019.07.10晚python矩阵运算大全1.矩阵的输出形式:对于任何一个矩阵,python输出的模板是:import numpy as n ...

  3. [python] 安装numpy+scipy+matlotlib+scikit-learn及问题解决

    这篇文章主要讲述Python如何安装Numpy.Scipy.Matlotlib.Scikit-learn等库的过程及遇到的问题解决方法.最近安装这个真是一把泪啊,各种不兼容问题和报错,希望文章对你有所 ...

  4. Python数据分析-Numpy数值计算

    Numpy介绍: NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能: 1)ndarray,一个多维数组结构,高效且节省空间 2)无需循环对整组 ...

  5. Python的numpy库下的几个小函数的用法

    numpy库是Python进行数据分析和矩阵运算的一个非常重要的库,可以说numpy让Python有了matlab的味道 本文主要介绍几个numpy库下的小函数. 1.mat函数 mat函数可以将目标 ...

  6. NumPy线性代数

    NumPy - 线性代数 NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能. 此模块中的一些重要功能如下表所述. 序号 函数及描述 1. dot 两个数组的点积 2. vdo ...

  7. Python之Numpy详细教程

    NumPy - 简介 NumPy 是一个 Python 包. 它代表 “Numeric Python”. 它是一个由多维数组对象和用于处理数组的例程集合组成的库. Numeric,即 NumPy 的前 ...

  8. Python 矩阵(线性代数)

    Python 矩阵(线性代数) 这里有一份新手友好的线性代数笔记,是和深度学习花书配套,还被Ian Goodfellow老师翻了牌. 笔记来自巴黎高等师范学院的博士生Hadrien Jean,是针对& ...

  9. Python中Numpy及Matplotlib使用

    Python中Numpy及Matplotlib使用 1. Jupyter Notebooks 作为小白,我现在使用的python编辑器是Jupyter Notebook,非常的好用,推荐!!! 你可以 ...

  10. python安装numpy和pandas

    最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装numpy和pandas因为linux环境没有外网遇到了很多问题就记下来了.首要条件,python版本必须 ...

随机推荐

  1. Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  2. PAT乙级1031

    题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805290334011392 题解 emmm.对于每个身份证号, ...

  3. libusb_bulk_transfer返回值不是0

    libusb_bulk_transfer返回值不是0 libusb_bulk_transfer返回值不是0libusb_bulk_transfer返回值不是0 ?????

  4. 【树形dp 思维题】HHHOJ#483. NOIP司马懿

    要注意利用一些题目的特殊条件吧. 题目大意 有一颗$n$个点带点权$a_i$的树,$q$次询问树上是否存在长度为$l$的路径. $n,q,l\le 10^5,0 \le a_i \le 2$ 题目分析 ...

  5. 【CF786B】Legacy

    题目大意:初始给定 N 个点,支持三种操作:两点之间连边:一个点与一个连续区间编号的点之间连边:一个连续区间内的点和一个点连边,求执行 N 次操作之后的单源最短路. 题解:学会了线段树优化建图. 发现 ...

  6. BZOJ 2836: 魔法树 (树链剖分+线段树)

    板题-记得开longlong #include <cstdio> #include <cctype> #include <cstring> #include < ...

  7. 【Winfrom-Button】 重写Button,去掉获取焦点时的边框

    Winfrom Button 去掉获取焦点时的边框: 自定义一个Button,重写ShowFocusCues方法 /// <summary> /// 去掉获取焦点的边框 /// </ ...

  8. 坚果Pro2刷魔趣系统教程,刷回锤子系统教程

    一.刷魔趣系统 1.高通驱动安装 https://blog.csdn.net/qq_43653944/article/details/86702169 2.刷入twrp rec https://blo ...

  9. maven的概念-02

    1.仓库 仓库分为两类:   1)  本地仓库    ->当前电脑上的maven仓库:         本地仓库的默认目录: ${user.home}/.m2/repository        ...

  10. BZOJ 5418: [Noi2018]屠龙勇士 EXCRT+multiset

    题解:求解形如 $A[i]ans\equiv b[i](mod$ $p[i])$ 的 $x$ 的最小正整数解. 考虑只有一个等式,那么可以直接化成 $exgcd$ 的形式:$A[i]ans+p[i]y ...