矩阵
矩阵是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]))