天天看点

Python 第三方模块 科学计算 NumPy模块 子模块

一.矩阵与矩阵库

1.矩阵

(1)创建矩阵:

np.matrix("<matrix_info>"):创建1个矩阵
  #参数说明:
    matrix_info:指定矩阵中的元素
      格式:"a11,a12...a1n;a21,a22...a2n;...;am1,am2...amn"
        注意:①aij是第i行第j列处的元素
            ②每行/每列的长度必须相等
            ③整体是1个str
            ④','用于分隔同1行的不同元素,';'用于分隔不同行
#实例:
>>> np.matrix("1,2;3,4")
matrix([[1, 2],
        [3, 4]])
>>> np.matrix("3+1j,2-2j;0,4+1j")#注意:即使虚部(即j前的系数)为1,也不能省略
matrix([[3.+1.j, 2.-2.j],
        [0.+0.j, 4.+1.j]])
           

(2)属性:

矩阵也可以使用ndarray对象的方法和属性,而下面2个属性不能用于ndarray对象

#########################################################################################

<mtr>.I:求逆矩阵
  #参数说明:
    mtr:指定矩阵

#实例:
>>> a=np.matrix("1,2;3,4")
>>> a.I
matrix([[-2. ,  1. ],
        [ 1.5, -0.5]])

#########################################################################################

<mtr>.H:求共轭转置矩阵
  #即先将每个元素都变为其共轭复数,再进行转置
  #对于实矩阵,和求转置相同

#实例:
>>> a=np.matrix("1,2;3,4")
>>> a.H
matrix([[1, 3],
        [2, 4]])
>>> b=np.matrix("3+1j,2-2j;0,4+1j")
>>> b.H
matrix([[3.-1.j, 0.-0.j],
        [2.+2.j, 4.-1.j]])
           

2.矩阵库(Matlib)

(1)简介:

NumPy中包含了1个矩阵库np.matlib,该模块中的方法返回矩阵(Matrix),而非Ndarray对象.矩阵里的元素可为数字/符号/数学式

注意:NumPy的__init__.py中没有引入matlib,因而需要通过import numpy.matlib来单独导入numpy.matlib
           

(2)方法:

np.matlib.empty(<shape>[,<dtype>,<order>]):返回未赋值的矩阵
  #由于未赋值,元素均为随机数
  #参数说明:
    shape:指定新矩阵形状;整数/整数元组
      格式:x;(x1,x2)依次指定列,行的长度
      #由于是Matrix,一定是2维;shape为整数时,列长度自动设为1;shape中元素多于2时,取最后2个依次指定列,行的长度
    dtype:数据类型;无需加"";默认为np.float64
    order:"C"/"F"/"A"/"K"
    #不传入dtype也可直接传入order而无需占位符;但如果均传入必须先传入dtype再传入order

#实例:
>>> a=np.matlib.empty(2)
>>> print(a)
[[0. 0.]]
>>> a=np.matlib.empty((2,2))
>>> print(a)
[[5.e-324 4.e-323]
 [2.e-323 2.e-323]]
>>> type(a[0,0])
<class 'numpy.float64'>
>>> a=np.matlib.empty((2,2),np.int8)
>>> print(a)
[[1 1]
 [1 1]]
>>> print(type(a[0,0]))
<class 'numpy.int8'>
[[0. 0. 0.]>>> a=np.matlib.empty((2,2),"F")
>>> print(a)
[[1.4e-45+0.j 1.1e-44+0.j]
 [5.6e-45+0.j 5.6e-45+0.j]]
 [0. 0. 0.]]
>>> a=np.matlib.empty((2,2),"F",np.float32)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\1234\AppData\Roaming\Python\Python37\site-packages\numpy\matlib.py", line 49, in empty
    return ndarray.__new__(matrix, shape, dtype, order=order)
ValueError: Non-string object detected for the array ordering. Please pass in 'C', 'F', 'A', or 'K' instead
>>> a=np.matlib.empty((2,2),np.float32,"F")
>>> print(a)
[[-4.1328328e+33 -1.4827223e-31]
 [-1.6491286e-18 -2.4292266e-30]]

##########################################################

np.matlib.zeros(<shape>[dtype,order]):返回零矩阵
  #参数说明:同.empty()

#实例:
>>> a=np.matlib.zeros((2,3))
>>> print(a)
[[0. 0. 0.]
 [0. 0. 0.]]
>>> a=np.matlib.zeros((2,3),"F")
>>> print(a)
[[0.+0.j 0.+0.j 0.+0.j]
 [0.+0.j 0.+0.j 0.+0.j]]
>>> a=np.matlib.zeros((2,3),np.float16,"F")
>>> print(a)
[[0. 0. 0.]
 [0. 0. 0.]]

##########################################################

np.matlib.ones(<shape>[dtype,order]):返回所有元素均为1的矩阵
  #参数说明:同.empty()

#实例:
>>> a=np.matlib.ones((2,3),np.float16,"F")
>>> print(a)
[[1. 1. 1.]
 [1. 1. 1.]]
>>> a=np.matlib.ones((2,3))
>>> print(a)
[[1. 1. 1.]
 [1. 1. 1.]]
>>> type(a[0,0])
<class 'numpy.float64'>

##########################################################

a=np.matlib.eye(n=None[,M=n,k=0,dtype=float,order="C"]):返回对角线上为1,其余元素为0的矩阵
  #即a[i,i](i=1,2...min{r,c})处为1,其余元素为0
  #参数说明:其他同.empty()
    n,M:指定矩阵行/列数;为int
      #也可为位置参数
    k:指定使用的对角线;为int(0表示主对角线,>0向上,<0向下)

#实例:
>>> a=np.matlib.eye(3)
>>> print(a)
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
>>> a=np.matlib.eye(3,2)
>>> print(a)#不一定是严格的主对角线
[[1. 0.]
 [0. 1.]
 [0. 0.]]
>>> np.matlib.eye(3,k=1)
matrix([[0., 1., 0.],
        [0., 0., 1.],
        [0., 0., 0.]])

##########################################################

np.matlib.identity(<n>[,dtype=np.float64]):返回单位矩阵
  #参数说明:dtype同.empty()
    n:单位矩阵的阶数

#实例:
>>> a=np.matlib.identity(3)
>>> print(a)
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

##########################################################

np.matlib.rand(<r>,<c>):返回给定大小的随机矩阵
  #参数说明:
    r:矩阵行数
    c:矩阵列数
    #只传入1个参数时,指定的是c,r默认设为1

#实例:
>>> a=np.matlib.rand(3,2)
>>> print(a)
[[0.21439311 0.48114605]
 [0.40680903 0.06696259]
 [0.08474975 0.99663275]]
>>> a=np.matlib.rand(3)
>>> print(a)
[[0.5019926  0.04551271 0.86878242]]

##########################################################

#Matrix与Ndarray对象的转换:
>>> i=np.matrix('1,2;3,4')
>>> print(i)
[[1 2]
 [3 4]]
>>> j=np.asarray(i)
>>> print(j)
[[1 2]
 [3 4]]
>>> k=np.asmatrix(j)
>>> print(k)
[[1 2]
 [3 4]]
           

二.线性代数模块(linalg)

1.简介:

NumPy提供了线性代数函数库linalg,其中包含了线性代数所需的所有功能

注意:该子模块无需单独导入
           

2.方法:

np.linalg.det(A):返回方阵A的行列式
  #如果A是高维数组,将其视为多个方阵(第n,n-1维)分别求行列式,返回所有行列式构成的数组

#实例:
>>> print(np.linalg.det([[1,2,0],[4,2,3],[7,8,4]]))
-5.999999999999997
>>> print(np.linalg.det([[1,2,0],[4,2,3],[7,8,4],[1,2,3]]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<__array_function__ internals>", line 6, in det
  File "C:\Users\1234\AppData\Roaming\Python\Python37\site-packages\numpy\linalg\linalg.py", line 2113, in det
    _assert_stacked_square(a)
  File "C:\Users\1234\AppData\Roaming\Python\Python37\site-packages\numpy\linalg\linalg.py", line 213, in _assert_stacked_square
    raise LinAlgError('Last 2 dimensions of the array must be square')
numpy.linalg.LinAlgError: Last 2 dimensions of the array must be square
>>> print(np.linalg.det([[[1,2,0],[4,2,3],[7,8,4]],[[1,3,2],[0,1,2],[3,1,2]]]))
[-6. 12.]

######################################################################################################################

np.linalg.solve(A,B):求解线性方程组AX=B

#实例:
>>> np.linalg.solve([[1,2,3,0],[2,3,1,2],[3,1,2,4],[1,2,3,4]],[1,2,3,4])
array([-0.25,  0.25,  0.25,  0.75])
>>> np.linalg.solve([[1,2],[3,4]],[[1,1],[2,2]])
array([[0. , 0. ],
       [0.5, 0.5]])

######################################################################################################################

np.linalg.inv(A):返回矩阵A的逆矩阵

#实例:
>>> np.linalg.inv([[1,2,3],[2,1,4],[4,5,1]])
array([[-0.7037037 ,  0.48148148,  0.18518519],
       [ 0.51851852, -0.40740741,  0.07407407],
       [ 0.22222222,  0.11111111, -0.11111111]])
>>> np.linalg.inv([[0,1],[0,0]])#矩阵不可逆
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<__array_function__ internals>", line 6, in inv
  File "C:\Users\1234\AppData\Roaming\Python\Python37\site-packages\numpy\linalg\linalg.py", line 547, in inv
    ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)
  File "C:\Users\1234\AppData\Roaming\Python\Python37\site-packages\numpy\linalg\linalg.py", line 97, in _raise_linalgerror_singular
    raise LinAlgError("Singular matrix")
numpy.linalg.LinAlgError: Singular matrix

######################################################################################################################

(solution,residuals,rank,sv)=np.linalg.lstsq(A,B[,rcond="warn"]):求解线性方程组AX=B
  #参数说明:
    solution:返回方程组的解;为array/matrix
	rank:返回A为几阶矩阵;为int
	sv:返回A的奇异值;为array

#实例:
>>> np.linalg.lstsq([[1,2,3,0],[2,3,1,2],[3,1,2,4],[1,2,3,4]],[1,2,3,4])
(array([-0.25,  0.25,  0.25,  0.75]), array([], dtype=float64), 4, array([8.80282469, 2.93280054, 1.98236121, 1.40684136]))
>>> np.linalg.lstsq([[1,2,3,0],[2,3,1,2],[3,1,2,4],[1,2,3,4]],[[1,2,3,4],[2,3,4,5],[3,4,5,6],[4,5,6,7]])
(array([[-0.25      , -0.08333333,  0.08333333,  0.25      ],
       [ 0.25      ,  0.41666667,  0.58333333,  0.75      ],
       [ 0.25      ,  0.41666667,  0.58333333,  0.75      ],
       [ 0.75      ,  0.75      ,  0.75      ,  0.75      ]]), array([], dtype=float64), 4, array([8.80282469, 2.93280054, 1.98236121, 1.40684136]))

######################################################################################################################

X=np.linalg.eig(A):求矩阵A的特征值和特征向量
  #参数说明:
    X:X[1]为属于X[0][0]的特征向量,X[2]为属于X[0][1]的特征向量...

#实例:
>>> np.linalg.eig([[1,0],[0,1]])
(array([1., 1.]), array([[1., 0.],
       [0., 1.]]))

######################################################################################################################

(U,S,V)=np.linalg.svd(M[,full_matrices=1,compute_uv=1]):对矩阵M进行奇异值分解

#实例:
>>> np.linalg.svd([[1,2],[3,4]])
(array([[-0.40455358, -0.9145143 ],
       [-0.9145143 ,  0.40455358]]), array([5.4649857 , 0.36596619]), array([[-0.57604844, -0.81741556],
       [ 0.81741556, -0.57604844]]))
           

三.随机数模块

参见:https://blog.csdn.net/vicdd/article/details/52667709