矩阵

1. 矩阵

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

矩阵的特殊计算方式可以很好的在应用在计算线性函数上

1.1 矩阵对象的创建

numpy的 matrix() 和 mat() 函数可以将二维数组转为矩阵

import numpy as np
# 创建一个3行3列的二维数组
data = np.arange(1, 10).reshape(3,3)

# 用mat()函数将数组转为矩阵
m1 = np.mat(data)
print(m1)			"""
                    matrix([[1, 2, 3],
                            [4, 5, 6],
                            [7, 8, 9]])
                    """
# 用matrix()函数将数组转为矩阵
m2 = np.matrix(data)
print(m2)			"""
                    matrix([[1, 2, 3],
                            [4, 5, 6],
                            [7, 8, 9]])
                    """

mat()和matrix()函数可以接受字符串形式的矩阵描述:
数据项通过空格分隔,数据行通过分号分隔。例如:‘1 2 3; 4 5 6’

m1 = np.mat('1 3 5; 2 6 7; 3 5 9')
print(m1)		"""
                matrix([[1, 3, 5],
                        [2, 6, 7],
                        [3, 5, 9]])
                """
m2 = np.matrix('1 3 5; 2 6 7; 3 5 9')
print(m2)		"""
                matrix([[1, 3, 5],
                        [2, 6, 7],
                        [3, 5, 9]])
                """

1.2 矩阵的乘法运算

矩阵的乘法与数组乘法不同:

  • 数组相乘, 各对应位置元素相乘
  • 矩阵相乘,第n行乘m列之和,作为结果的n, m个元素
    第一个矩阵列数必须等于第二个矩阵行数

在这里插入图片描述

对比数组相乘和矩阵相乘

import numpy as np

# 创建数组
arr = np.array([[1, 1, 1],
                [2, 2, 2],
                [3, 3, 3]])                
# 数组的乘法				# 数组的乘法, 对应的位置相乘
print(arr * arr)		"""
                        array([[1, 1, 1],
                               [4, 4, 4],	
                               [9, 9, 9]])
                        """

# 创建矩阵
m1 = np.mat(arr)
# 行乘以列 (第一个矩阵的行数必须等于第二个矩阵的列数) (第一个矩阵维度的第二个元素, 需要等于第二个矩阵的第一个元素)
print(m1 * m1)			"""	
                        matrix([[ 6,  6,  6],
                                [12, 12, 12],
                                [18, 18, 18]])
                        """

""" 
	[1, 1, 1]		[1, 1, 1]		[(1*1+1*2+1*3), (1*1+1*2+1*3), (1*1+1*2+1*3)]
	[2, 2, 2]	*	[2, 2, 2]	=	[(2*1+2*2+2*3), (2*1+2*2+2*3), (2*1+2*2+2*3)]
	[3, 3, 3]		[3, 3, 3]		[(3*1+3*2+3*3), (3*1+3*2+3*3), (3*1+3*2+3*3)]
"""

(3, 3)矩阵 * (3, 3)矩阵, 可得(3, 3)矩阵
(1, 2)矩阵 * (2, 4)矩阵, 可得(1, 4)矩阵
(A, B)矩阵 * (C, D)矩阵, 可得(A, D)矩阵

1.3 逆矩阵 & 单位矩阵

单位矩阵:

  • 在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵。
  • 单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1,除此以外全都为0,记为 I n I_n In E n E_n En ,通常用I或E来表示。
  • 根据单位矩阵的特点,任何矩阵与单位矩阵相乘都等于本身,而且单位矩阵因此独特性有广泛用途

E 3 = [ 1 0 0 0 1 0 0 0 1 ] E_3 = \left[ \begin{array}{ccc} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{array} \right ] E3=100010001

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

可以用矩阵的 I (大写的i) 属性得到该矩阵的逆矩阵

m = np.matrix('1 3 5; 2 6 7; 3 5 9')
                """matrix([[1, 3, 5],
                           [2, 6, 7],
                           [3, 5, 9]])"""
        
print(m.I)		# m的逆矩阵
                """
                matrix([[-1.58333333,  0.16666667,  0.75      ],
                        [-0.25      ,  0.5       , -0.25      ],
                        [ 0.66666667, -0.33333333,  0.        ]])
                """
print(m * m.I)	# m乘以m的逆矩阵,得到一个得矩阵
                """
                matrix([[ 1.00000000e+00, -5.55111512e-17,  1.66533454e-16],
                        [ 3.33066907e-16,  1.00000000e+00,  3.33066907e-16],
                        [-3.33066907e-16,  1.66533454e-16,  1.00000000e+00]])
                """

1.4 矩阵的应用

用逆矩阵的概念解矩阵的除法

  • 矩阵A * 矩阵B = 矩阵C
  • 已知A, C 求 B
  • 矩阵B = 矩阵C * 矩阵A的逆矩阵

案例:用矩阵和逆矩阵的方法解线性方程组

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

表示成矩阵:

[ 3 3.2 3.5 3.6 ] × [ x y ] = [ 118.4 135.2 ] \left[ \begin{array}{ccc} 3 & 3.2 \\ 3.5 & 3.6 \\ \end{array} \right] \times \left[ \begin{array}{ccc} x \\ y \\ \end{array} \right] =\left[ \begin{array}{ccc} 118.4 \\ 135.2 \\ \end{array} \right] [33.53.23.6]×[xy]=[118.4135.2]

需要用除法得到[x, y]矩阵, 可以用逆矩阵的概念来解

import numpy as np
# 解方程
prices = np.mat('3 3.2; 3.5 3.6')   # 单位票价是(2,2)的矩阵
totals = np.mat('118.4; 135.2')     # 总票价是(1,1)的矩阵

print(prices)		"""	# 单位票价矩阵
                    matrix([[3.0, 3.2],
                            [3.5, 3.6]])
                    """

print(totals)		"""	# 总票价矩阵
                    matrix([[118.4],
                            [135.2]])
                    """
x = prices.I * totals  	# 利用矩阵的逆矩阵进行求解

print(x)			"""
                    matrix([[16.0],		# 成年人的人数
                            [22.0]])	# 儿童的人数
                    """

案例: 用矩阵计算出第n个斐波那契数列的值

# 用矩阵计算出第n个斐波那契数列的值
F = np.mat('1 1; 1 0')

n = 5
print(F ** n)
                        """		# 第5个斐波那契数列的值是8
                        matrix([[8, 5],
                                [5, 3]])
                        """
n = 20
print(F ** n)
                        """		# 第20个斐波那契数列的值是10946
                        matrix([[10946,  6765],
                                [ 6765,  4181]])
                        """
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值