zoukankan      html  css  js  c++  java
  • numpy矩阵的常用用法

    基本操作

    >>> m= np.mat([1,2,3]) #创建矩阵
    >>> m
    matrix([[1, 2, 3]])
     
    >>> m[0]        #取一行
    matrix([[1, 2, 3]])
    >>> m[0,1]       #第一行,第2个数据
    2
    >>> m[0][1]       #注意不能像数组那样取值了
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/usr/lib64/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 305, in __getitem__
      out = N.ndarray.__getitem__(self, index)
    IndexError: index 1 is out of bounds for axis 0 with size 1
     
    #将Python的列表转换成NumPy的矩阵
    >>> list=[1,2,3]
    >>> mat(list)
    matrix([[1, 2, 3]])
     
    #Numpy dnarray转换成Numpy矩阵
    >>> n = np.array([1,2,3])
    >>> n
    array([1, 2, 3])
    >>> np.mat(n)
    matrix([[1, 2, 3]])
     
    #排序
    >>> m=np.mat([[2,5,1],[4,6,2]])  #创建2行3列矩阵
    >>> m
    matrix([[2, 5, 1],
        [4, 6, 2]])
    >>> m.sort()          #对每一行进行排序
    >>> m
    matrix([[1, 2, 5],
        [2, 4, 6]])
     
    >>> m.shape           #获得矩阵的行列数
    (2, 3)
    >>> m.shape[0]         #获得矩阵的行数
    2
    >>> m.shape[1]         #获得矩阵的列数
    3
     
    #索引取值
    >>> m[1,:]           #取得第一行的所有元素
    matrix([[2, 4, 6]])
    >>> m[1,0:1]          #第一行第0个元素,注意左闭右开
    matrix([[2]])
    >>> m[1,0:3]
    matrix([[2, 4, 6]])
    >>> m[1,0:2]
    matrix([[2, 4]])

    矩阵乘法

    矩阵乘,与Numpy dnarray类似,可以使用np.dot()和np.matmul(),除此之外,由于matrix中重载了“*”,因此“*”也能用于矩阵乘。

    >>> a = np.mat([[1,2,3], [2,3,4]])
    >>> b = np.mat([[1,2], [3,4], [5,6]])
    >>> a
    matrix([[1, 2, 3],
        [2, 3, 4]])
    >>> b
    matrix([[1, 2],
        [3, 4],
        [5, 6]])
    >>> a * b     #方法一
    matrix([[22, 28],
        [31, 40]])
    >>> np.matmul(a, b)  #方法二
    matrix([[22, 28],
        [31, 40]])
    >>> np.dot(a, b)   #方法三
    matrix([[22, 28],
        [31, 40]])

    点乘,只剩下multiply方法了。

    >>> a = np.mat([[1,2], [3,4]])
    >>> b = np.mat([[2,2], [3,3]])
    >>> np.multiply(a, b)
    matrix([[ 2, 4],
        [ 9, 12]])

    矩阵转置

    转置有两种方法:

    >>> a
    matrix([[1, 2],
        [3, 4]])
    >>> a.T      #方法一,ndarray也行
    matrix([[1, 3],
        [2, 4]])
    >>> np.transpose(a)  #方法二
    matrix([[1, 3],
        [2, 4]])

    值得一提的是,matrix中求逆还有一种简便方法(ndarray中不行):

    >>> a
    matrix([[1, 2],
        [3, 4]])
    >>> a.I
    matrix([[-2. , 1. ],
        [ 1.5, -0.5]])

    矩阵的范数

    import numpy as np
    from numpy import linalg as LA
    
    
    a = np.array([-3, -5, -7, 2,  6,  4,  0,  2,  8])
    b = a.reshape((3, 3))
    print(b)
    '''
    [[-3 -5 -7]
     [ 2  6  4]
     [ 0  2  8]]
    '''
    
    print( LA.norm(b))
    #14.38749456993816
    
    print(np.linalg.norm(b, ord=2))
    #13.686302989309274
    
    print(np.linalg.norm(b, ord=1))
    #19.0
    
    print(np.linalg.norm(b, ord=np.inf))
    #15.0

     如果A为向量,则二范数求的是向量的模长

    下面介绍ndarray形式的矩阵

    矩阵求逆、行列式(ndarray)

    定义数组(ndarray)

    >>> import numpy as np
    >>> m = np.array([[1,2,3], [2,3,4]])    #定义矩阵,int64
    >>> m
    array([[1, 2, 3],
        [2, 3, 4]])
    >>> m = np.array([[1,2,3], [2,3,4]], dtype=np.float)  #定义矩阵,float64
    >>> m
    array([[1., 2., 3.],
        [2., 3., 4.]])
    >>> print(m.dtype)  #数据类型  
    float64
    >>> print(m.shape)  #形状2行3列
    (2, 3)
    >>> print(m.ndim)   #维数
    2
    >>> print(m.size)   #元素个数
    6
    >>> print(type(m))
    <class 'numpy.ndarray'>

    还有一些特殊的方法可以定义矩阵

    >>> m = np.zeros((2,2))     #全0
    >>> m
    array([[0., 0.],
        [0., 0.]])
    >>> print(type(m))        #也是ndarray类型
    <class 'numpy.ndarray'>
    >>> m = np.ones((2,2,3))    #全1
    >>> m = np.full((3,4), 7)    #全为7
    >>> np.eye(3)          #单位矩阵
    array([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])
    >>> np.arange(20).reshape(4,5)  #生成一个4行5列的数组
    >>>
    >>> np.random.random((2,3))    #[0,1)随机数
    array([[0.51123127, 0.40852721, 0.26159126],
        [0.42450279, 0.34763668, 0.06167501]])
    >>> np.random.randint(1,10,(2,3))  #[1,10)随机整数的2行3列数组
    array([[5, 4, 9],
        [2, 5, 7]])
    >>> np.random.randn(2,3)       #正态随机分布
    array([[-0.29538656, -0.50370707, -2.05627716],
        [-1.50126655, 0.41884067, 0.67306605]])
    >>> np.random.choice([10,20,30], (2,3))   #随机选择
    array([[10, 20, 10],
        [30, 10, 20]])
    >>> np.random.beta(1,10,(2,3))       #贝塔分布
    array([[0.01588963, 0.12635485, 0.22279098],
        [0.08950147, 0.02244569, 0.00953366]])

    操作数组(ndarray)

    >>> from numpy import *
    >>> a1=array([1,1,1])  #定义一个数组
    >>> a2=array([2,2,2])
    >>> a1+a2        #对于元素相加
    array([3, 3, 3])
    >>> a1*2         #乘一个数
    array([2, 2, 2])
     
    ##
    >>> a1=np.array([1,2,3])
    >>> a1
    array([1, 2, 3])
    >>> a1**3       #表示对数组中的每个数做立方
    array([ 1, 8, 27])
     
    ##取值,注意的是它是以0为开始坐标,不matlab不同
    >>> a1[1]
    2
     
    ##定义多维数组
    >>> a3=np.array([[1,2,3],[4,5,6]])
    >>> a3
    array([[1, 2, 3],
        [4, 5, 6]])
    >>> a3[0]       #取出第一行的数据
    array([1, 2, 3])
    >>> a3[0,0]      #第一行第一个数据
    1
    >>> a3[0][0]     #也可用这种方式
    1
    >>> a3
    array([[1, 2, 3],
        [4, 5, 6]])
    >>> a3.sum(axis=0)   #按行相加,列不变
    array([5, 7, 9])
    >>> a3.sum(axis=1)   #按列相加,行不变
    array([ 6, 15])

    矩阵的数学运算(ndarray)

    关于方阵

    >>> m = np.array([[1,2,3], [2,2,3], [2,3,4]])  #定义一个方阵
    >>> m
    array([[1, 2, 3],
        [2, 2, 3],
        [2, 3, 4]])
    >>> print(np.linalg.det(m))    #求行列式
    1.0
    >>> print(np.linalg.inv(m))    #求逆
    [[-1. 1. 0.]
     [-2. -2. 3.]
     [ 2. 1. -2.]]
    >>> print(np.linalg.eig(m))   #特征值 特征向量
    (array([ 7.66898014+0.j    , -0.33449007+0.13605817j,
        -0.33449007-0.13605817j]), array([[-0.47474371+0.j    , -0.35654645+0.23768904j,
        -0.35654645-0.23768904j],
        [-0.53664812+0.j    , 0.80607696+0.j    ,
         0.80607696-0.j    ],
    [-0.6975867 +0.j    , -0.38956192-0.12190158j,
        -0.38956192+0.12190158j]]))
    >>> y = np.array([1,2,3])
    >>> print(np.linalg.solve(m, y))  #解方程组
    [ 1. 3. -2.]

    矩阵乘法(ndarray)

    >>> a = np.array([[1,2,3], [2,3,4]])
    >>> b = np.array([[1,2], [3,4], [5,6]])
    >>> a
    array([[1, 2, 3],
        [2, 3, 4]])
    >>> b
    array([[1, 2],
        [3, 4],
        [5, 6]])
    >>> np.dot(a, b)   #方法一
    array([[22, 28],
        [31, 40]])
    >>> np.matmul(a,b)  #方法二
    array([[22, 28],

    注:一维数组之间运算时,dot()表示的是内积

    点乘:对应位置相乘(ndarray)

    >>> a = np.array([[1,2],[3,4]])
    >>> b = np.array([[1,1],[2,2]])
    >>> a
    array([[1, 2],
        [3, 4]])
    >>> b
    array([[1, 1],
        [2, 2]])
    >>> a * b          #方法一
    array([[1, 2],
        [6, 8]])
    >>> np.multiply(a, b)  #方法二
    array([[1, 2],
        [6, 8]])

     

    LU分解

    import scipy as scipy
    from scipy import linalg
    l,u = scipy.linalg.lu(A,True)
  • 相关阅读:
    BadUSB 利用
    java 将函数作为参数传递
    odoo12 修行提升篇之 常用的高阶函数 (二)
    odoo12 修行提升篇之 异步定时任务 (一)
    odoo12 修行基础篇之 利用kanban做分析 点击跳转分析模型列表 (九)
    odoo12 修行基础篇之 kanban (八)
    odoo12 修行基础篇之 记录批处理 (七)
    odoo12 修行基础篇之 列表的筛选和分组 (六)
    odoo12 修行基础篇之 添加记录编码 (五)
    odoo12 修行基础篇之 添加工作流和操作记录 (四)
  • 原文地址:https://www.cnblogs.com/xiaochi/p/11546946.html
Copyright © 2011-2022 走看看