zoukankan      html  css  js  c++  java
  • 矩阵

    矩阵

    矩阵是numpy.matrix类类型的对象,该类继承自numpy.ndarray,任何针对多维数组的操作,对矩阵同样有效,但是作为子类矩阵又结合其自身的特点,做了必要的扩充,比如:乘法计算、求逆等。

    矩阵对象的创建

    # 如果copy的值为True(缺省),所得到的矩阵对象与参数中的源容器各自拥有独立的数据拷贝。
    numpy.matrix(
        ary,        # 任何可被解释为矩阵的二维容器
          copy=True    # 是否复制数据(缺省值为True,即复制数据)
    )
    # 等价于:numpy.matrix(..., copy=False)
    # 由该函数创建的矩阵对象与参数中的源容器一定共享数据,无法拥有独立的数据拷贝
    numpy.mat(任何可被解释为矩阵的二维容器)
    # 该函数可以接受字符串形式的矩阵描述:
    # 数据项通过空格分隔,数据行通过分号分隔。例如:'1 2 3; 4 5 6'
    numpy.mat(拼块规则)
    # 矩阵
    
    import numpy as np
    #创建matrix对象(1)
    ary = np.arange(1, 10).reshape(3, 3)
    print(ary, type(ary))
    """
    [[1 2 3]
     [4 5 6]
     [7 8 9]] <class 'numpy.ndarray'>
    """
    ary2 = np.matrix(ary, copy=True)
    print(ary2, type(ary2))
    """
    [[1 2 3]
     [4 5 6]
     [7 8 9]] <class 'numpy.matrix'>
    """
    ary[0,0] = 999
    print(ary2, type(ary2))
    """
    [[1 2 3]
     [4 5 6]
     [7 8 9]] <class 'numpy.matrix'>
    """
    #创建matrex对象(2)
    m3 = np.mat(ary)
    print(m3)
    """
    [[999   2   3]
     [  4   5   6]
     [  7   8   9]]
    """
    #创建matrix对象(3)
    m4 = np.mat('1 2 3;4 5 6')
    print(m4,type(m4))
    """
    [[1 2 3]
     [4 5 6]] <class 'numpy.matrix'>
    """
    案例

    矩阵的乘法运算

    # 矩阵的乘法:乘积矩阵的第i行第j列的元素等于
    # 被乘数矩阵的第i行与乘数矩阵的第j列的点积
    #
    #           1   2   6
    #    X----> 3   5   7
    #    |      4   8   9
    #    |
    # 1  2  6   31  60  74
    # 3  5  7   46  87 116
    # 4  8  9   64 120 161
    e = np.mat('1 2 6; 3 5 7; 4 8 9')
    print(e * e)
    a = np.array(e)
    print(a+a)
    """
    [[ 2  4 12]
     [ 6 10 14]
     [ 8 16 18]]
    """
    print(a*a)
    """
    [[ 1  4 36]
     [ 9 25 49]
     [16 64 81]]
    """
    print(a.dot(a))
    """
    [[ 31  60  74]
     [ 46  87 116]
     [ 64 120 161]]
    """

    矩阵的逆矩阵

    若两个矩阵A、B满足:AB = BA = E (E为单位矩阵),则成为A、B为逆矩阵。

    e = np.mat('1 2 6; 3 5 7; 4 8 9')
    print(e.I)
    print(e * e.I)

    ndarray提供了方法让多维数组替代矩阵的运算:

    a = np.array([
        [1, 2, 6],
        [3, 5, 7],
        [4, 8, 9]])
    # 点乘法求ndarray的点乘结果,与矩阵的乘法运算结果相同
    k = a.dot(a)
    print(k)
    # linalg模块中的inv方法可以求取a的逆矩阵
    l = np.linalg.inv(a)
    print(l)

    案例:假设一帮孩子和家长出去旅游,去程坐的是bus,小孩票价为3元,家长票价为3.2元,共花了118.4;回程坐的是Train,小孩票价为3.5元,家长票价为3.6元,共花了135.2。分别求小孩和家长的人数。使用矩阵求解。

    #解方程
    import numpy as np
    A = np.mat('3 3.2;3.5 3.6')
    B = np.mat('118.4;135.2')
    x=np.linalg.lstsq(A,B)[0]
    print(x)
    """
    [[16.]
     [22.]]
    """
    x=A.I*B
    print(x)
    """
    [[16.]
     [22.]]
    """

    案例:斐波那契数列

    1 1 2 3 5 8 13 21 34 ...

    X      1   1    1   1    1   1
           1   0    1   0    1   0
        --------------------------------
    1  1   2   1    3   2    5   3
    1  0   1   1    2   1    3   2
     F^1    F^2      F^3       F^4  ...  f^n

    代码

    n = 35
    
    # 使用递归实现斐波那契数列
    def fibo(n):
        return 1 if n < 3 else fibo(n - 1) + fibo(n - 2)
    print(fibo(n))
    
    # 使用矩阵实现斐波那契数列
    print(int((np.mat('1. 1.; 1. 0.') ** (n - 1))[0, 0]))

     

     

     

     

     

  • 相关阅读:
    css
    Git使用
    Github入门
    flask框架预备知识
    django框架预备知识
    JSON格式
    盒模型详解
    position属性详解
    float属性详解
    display属性详解
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11474247.html
Copyright © 2011-2022 走看看