实验环境:jupyter+python3
1.引入numpy,使用mat函数创建一个2X3矩阵,查看a的值
import numpy as np
#使用mat函数创建一个2X3矩阵
a = np.mat([[1,2,3],[4,5,6]])
#查看a的值
a
matrix([[1, 2, 3],
[4, 5, 6]])
2.使用shape获取矩阵大小
#使用shape获取矩阵大小
a.shape
(2, 3)
3.使用下标读取矩阵的元素
#使用下标读取矩阵的元素
a.T
matrix([[1, 4],
[2, 5],
[3, 6]])
4.进行行列转换
#进行行列转换
a.transpose()
matrix([[1, 4],
[2, 5],
[3, 6]])
a.T
matrix([[1, 4],
[2, 5],
[3, 6]])
实际上官方文档建议我们使用二维数组代替矩阵来进行矩阵运算;因为二维数组用得较多,而且基本可取代矩阵
b = np.array([[1,2,3],[4,5,6]])
b
array([[1, 2, 3],
[4, 5, 6]])
b.T
array([[1, 4],
[2, 5],
[3, 6]])
加减法也是一样的
a+a
matrix([[ 2, 4, 6],
[ 8, 10, 12]])
b+b
array([[ 2, 4, 6],
[ 8, 10, 12]])
但是列表不行
c = [[1,2,3],[4,5,6]]
c+c
[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]
使用二维数组创建两个矩阵A和B
A = np.array([[1,2,3],[4,5,6]])
B = np.array([[1,4],[2,5],[3,6]])
A
array([[1, 2, 3],
[4, 5, 6]])
B
array([[1, 4],
[2, 5],
[3, 6]])
先来一个矩阵的数乘,见识矩阵的每一个元素乘以该数
#先来一个矩阵的数乘,见识矩阵的每一个元素乘以该数
2*A
array([[ 2, 4, 6],
[ 8, 10, 12]])
2*B
array([[ 2, 8],
[ 4, 10],
[ 6, 12]])
dot函数用于矩阵乘法,对于二维数组,它计算的是矩阵乘积,对于一维数组,它计算的是内积。注意交换矩阵的前后位置会导致不同的结果,看下面的例子
np.dot(A,B)
array([[14, 32],
[32, 77]])
np.dot(B,A)
array([[17, 22, 27],
[22, 29, 36],
[27, 36, 45]])
再创建一个二维数组
C = np.array([[1,2],[1,3]])
C
array([[1, 2],
[1, 3]])
我们验证一个矩阵乘法的结合性 (AB)C=A(BC)
np.dot(np.dot(A,B),C)
array([[ 46, 124],
[109, 295]])
np.dot(A,np.dot(B,C))
array([[ 46, 124],
[109, 295]])
接着看一下分配性 (A+B)C=AC+BC,C(A+B)=CA+CB
D = B-1
D
array([[0, 3],
[1, 4],
[2, 5]])
np.dot(A,B+D)
array([[ 22, 58],
[ 49, 139]])
np.dot(A,B)+np.dot(A,D)
array([[ 22, 58],
[ 49, 139]])
数乘的结合性,也一样啦:
2*(np.dot(A,B))
array([[ 28, 64],
[ 64, 154]])
np.dot(A,2*B)
array([[ 28, 64],
[ 64, 154]])
np.dot(2*A,B)
array([[ 28, 64],
[ 64, 154]])
接着我们用到一个新知识,使用eye创建一个单位矩阵,单位矩阵的定义就是看下面的步骤
I = np.eye(3)
I
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
我们看一下,一个矩阵A乘以一个单位矩阵,还是它本身
np.dot(A,I)
array([[1., 2., 3.],
[4., 5., 6.]])
矩阵的转置很简单,就是将矩阵的行变为列,将列变为行,我们先通过例子看一下矩阵转置是怎么做的。然后验证几个规律。
A
array([[1, 2, 3],
[4, 5, 6]])
A.T
array([[1, 4],
[2, 5],
[3, 6]])
3.我们验证第一个性质
A.T.T
array([[1, 2, 3],
[4, 5, 6]])
(A’)’=A,如上所示
再创建两个尺寸相同的矩阵
B
array([[1, 4],
[2, 5],
[3, 6]])
D
array([[0, 3],
[1, 4],
[2, 5]])
(B+D).T
array([[ 1, 3, 5],
[ 7, 9, 11]])
B.T+D.T
array([[ 1, 3, 5],
[ 7, 9, 11]])
10*A.T
array([[10, 40],
[20, 50],
[30, 60]])
(10*A).T
array([[10, 40],
[20, 50],
[30, 60]])
np.dot(A,B).T
array([[14, 32],
[32, 77]])
np.dot(A.T,B.T)
array([[17, 22, 27],
[22, 29, 36],
[27, 36, 45]])
np.dot(B.T,A.T)
array([[14, 32],
[32, 77]])
1.创建一个方阵(方阵就是行数等于列数的矩阵)
E = np.array([[1,2,3],[4,5,6],[7,8,9]])
E
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
2.用trace计算方阵的迹
np.trace(E)
15
3.再创建一个方阵
F = E-2
F
array([[-1, 0, 1],
[ 2, 3, 4],
[ 5, 6, 7]])
4.验证一下方阵的迹等于方阵转置的迹
np.trace(E)
15
np.trace(E.T)
15
5.验证一下方阵的乘积的迹等于
np.trace(np.dot(E,F))
171
np.trace(np.dot(F,E))
171
6.验证一下方阵和的迹等于方阵迹的和
np.trace(E+F)
24
np.trace(E)+np.trace(F)
24
使用det方法求得方阵E和F的行列式
np.linalg.det(E)
-9.51619735392994e-16
np.linalg.det(F)
1.0658141036401459e-15
C
array([[1, 2],
[1, 3]])
np.linalg.det(C)
1.0
设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得: AB=BA=E。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。当矩阵A的行列式|A|不等于0时才存在可逆矩阵。
1.创建一个方阵
A = np.array([[1,-2,1],[0,2,-1],[1,1,-2]])
A
array([[ 1, -2, 1],
[ 0, 2, -1],
[ 1, 1, -2]])
2.使用linalg.det求得方阵的行列式
A_abs = np.linalg.det(A)
A_abs
-2.9999999999999996
3.使用linalg.inv求得方阵的逆矩阵
B = np.linalg.inv(A)
B
array([[ 1.00000000e+00, 1.00000000e+00, -1.11022302e-16],
[ 3.33333333e-01, 1.00000000e+00, -3.33333333e-01],
[ 6.66666667e-01, 1.00000000e+00, -6.66666667e-01]])
用python的numpy包中的linalg.solve()方法解多元一次方程,如果你对矩阵解方程非常熟悉,那么现在只是学习一下这个函数就好了。
2.将未知数系数写下来,排列成一个矩阵a
a = [[1,2,1],[2,-1,3],[3,1,2]]
a = np.array(a)
a
array([[ 1, 2, 1],
[ 2, -1, 3],
[ 3, 1, 2]])
3.常数项构成一个一维数组
b = [7,7,18]
b = np.array(b)
b
array([ 7, 7, 18])
x = np.linalg.solve(a,b)
x
array([ 7., 1., -2.])
np.dot(a,x)
array([ 7., 7., 18.])
发现与方程组系数相符合,得到正确的解