矩阵

矩阵

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

 

 

 

 

 

 

 

posted @ 2019-09-06 13:06  maplethefox  阅读(373)  评论(0编辑  收藏  举报