Jupyter中Python矩阵基本运算的学习记录

实验环境:jupyter+python3

一、python矩阵操作

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]]

二、python矩阵乘法

使用二维数组创建两个矩阵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.]])

三、矩阵转置

矩阵的转置很简单,就是将矩阵的行变为列,将列变为行,我们先通过例子看一下矩阵转置是怎么做的。然后验证几个规律。

  1. 先创建一个矩阵A
A
array([[1, 2, 3],
       [4, 5, 6]])
  1. 我们使用属性T来得到矩阵A的转置矩阵
A.T
array([[1, 4],
       [2, 5],
       [3, 6]])

3.我们验证第一个性质

A.T.T
array([[1, 2, 3],
       [4, 5, 6]])
  1. (A’)’=A,如上所示

  2. 再创建两个尺寸相同的矩阵

B
array([[1, 4],
       [2, 5],
       [3, 6]])
D
array([[0, 3],
       [1, 4],
       [2, 5]])
  1. 验证矩阵转置的第二个性质:(A±B)’=A’±B’
(B+D).T
array([[ 1,  3,  5],
       [ 7,  9, 11]])
B.T+D.T
array([[ 1,  3,  5],
       [ 7,  9, 11]])
  1. 验证矩阵转置的第三个性质:(KA)’=KA’
10*A.T
array([[10, 40],
       [20, 50],
       [30, 60]])
(10*A).T
array([[10, 40],
       [20, 50],
       [30, 60]])
  1. 验证矩阵转置的第四个性质:(A×B)’= B’×A’
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]])

四、python求方阵的迹

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

五、python方阵的行列式计算方法

使用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

六、python求逆矩阵/伴随矩阵

设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解多元一次方程

用python的numpy包中的linalg.solve()方法解多元一次方程,如果你对矩阵解方程非常熟悉,那么现在只是学习一下这个函数就好了。

  1. 首先看一下我们要解的方程,将这个方程格式调整好,按照x-y-z-常数项的顺序排列
    {x+2y+z=7
    2x-y+3z=7
    3x+y+2z=18
    }

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])
  1. 使用linalg.solve方法解方程,参数a指的是系数矩阵,参数b指的是常数项矩阵:
x = np.linalg.solve(a,b)
x
array([ 7.,  1., -2.])
  1. 我们得到的解对不对呢?使用点乘的方法可以验证一下,系数乘以未知数可以得到常数项。
np.dot(a,x)
array([ 7.,  7., 18.])

发现与方程组系数相符合,得到正确的解

你可能感兴趣的:(python,机器学习,numpy,线性代数)