鄙人学习笔记,这个笔记以例子为主。
开发工具:Spyder
矩阵
矩阵是numpy.matrix类的对象,该类继承自numpy.ndarray,任何针对多维数组的操作,对矩阵同样有效,但作为子类矩阵又结合其自身的特点,做了必要的扩充,比如:乘法计算、求逆。
矩阵对象的创建
①创建方法1
- 语法
# 如果copy的值为True(缺省),所得到的矩阵对象与参数中的源容器各自拥有独立的数据拷贝, 否则共享同一份数据。
numpy.matrix(
ary, # 任何可被解释为矩阵的二维容器
copy=True # 是否复制数据(缺省值为True,即复制数据)
)
备注:默认选项(c),又称缺省值,是一种计算机术语,指在无决策者干预情况下,对于决策或应用软件、计算机程序的系统参数的自动选择。
- 举个例子
代码1:
import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
m = np.matrix(ary, copy=True)
print(m, type(m))
ary[0, 0] = 999
print(m, type(m))
结果1:
[[1 2 3]
[4 5 6]
[7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[1 2 3]
[4 5 6]
[7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
代码2:
import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
m = np.matrix(ary, copy = False)
print(m, type(m))
ary[0, 0] = 999
print(m, type(m))
结果2:
[[1 2 3]
[4 5 6]
[7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[999 2 3]
[ 4 5 6]
[ 7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
②创建方法2
- 语法
# 等价于:numpy.matrix(..., copy=False)
# 由该函数创建的矩阵对象与参数中的源容器一定共享数据,无法拥有独立的数据拷贝
numpy.mat(任何可被解释为矩阵的二维容器)
# 该函数可以接受字符串形式的矩阵描述:
# 数据项通过空格分隔,数据行通过分号分隔。
#例如:'1 2 3; 4 5 6'
numpy.mat(拼块规则)
- 例子
代码:
import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
ary02 = np.mat(ary)
print(ary02, type(ary02))
ary03 = np.mat('1 2 3;4 5 6')
print(ary03, type(ary03))
结果:
[[1 2 3]
[4 5 6]
[7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[1 2 3]
[4 5 6]] <class 'numpy.matrixlib.defmatrix.matrix'>
矩阵的乘法运算
- 语法
# 矩阵的乘法:乘积矩阵的第i行第j列的元素等于
# 被乘数矩阵的第i行与乘数矩阵的第j列的点积
e = np.mat('1 2 6; 3 5 7; 4 8 9')
print(e * e)
- 例子
代码:
import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
#数组相乘
print(ary*ary)
#矩阵相乘
print(np.mat(ary)*np.mat(ary))
结果:
[[ 1 4 9]
[16 25 36]
[49 64 81]]
[[ 30 36 42]
[ 66 81 96]
[102 126 150]]
矩阵的逆运算
若两个矩阵A、B满足:AB = BA = E (E为单位矩阵),则称B和A互为对方的逆矩阵。
- 语法
e = np.mat('1 2 6; 3 5 7; 4 8 9')
print(e.I) #e的逆矩阵
- 例子
代码:
import numpy as np
a = np.mat('2 0 0;0 3 0; 0 0 4')
#原矩阵
print(a)
#矩阵的逆
print(a.I)
#矩阵相乘
print(a*a.I)
结果:
[[2 0 0]
[0 3 0]
[0 0 4]]
[[ 0.5 0. -0. ]
[ 0. 0.33333333 -0. ]
[ 0. 0. 0.25 ]]
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
备注1:若矩阵A没有逆矩阵,则有些numpy版本会报错,有些则不会,需要注意。若A不为方阵,则会求出广义逆矩阵。
备注2:np.linalg.inv(A)也可以求逆矩阵,但A必须为方阵。若A不为方阵,则会报错。
多维数组的矩阵运算
ndarray提供了方法对多维数组进行矩阵运算。
- 语法
a = np.array([
[1, 2, 6],
[3, 5, 7],
[4, 8, 9]])
# 点乘法求ndarray的点乘结果,与矩阵的乘法运算结果相同
k = a.dot(a)
# linalg模块中的inv方法可以求取a的逆矩阵
l = np.linalg.inv(a)
- 例子
代码:
import numpy as np
a = np.array([[2, 0, 1],
[0, 4, 0],
[1, 0, 5]])
#原矩阵
print(a)
#矩阵相乘
print(a.dot(a))
#矩阵的逆
print(np.linalg.inv(a))
结果:
[[2 0 1]
[0 4 0]
[1 0 5]]
[[ 5 0 7]
[ 0 16 0]
[ 7 0 26]]
[[ 0.55555556 0. -0.11111111]
[ 0. 0.25 0. ]
[-0.11111111 0. 0.22222222]]
案例
求方程组:
中x, y ,z分别为多少?
计算方法1:
import numpy as np
a = np.array([[1, 3, 5],
[2, 1, 6],
[1, 1, 2]])
b = np.array([[1], [2], [3]])
inv_a = np.linalg.inv(a)
print(inv_a.dot(b))
结果1:
[[ 4.71428571]
[ 1.14285714]
[-1.42857143]]
计算方法2:
import numpy as np
a = np.mat([[1, 3, 5],
[2, 1, 6],
[1, 1, 2]])
b = np.mat([[1], [2], [3]])
#print(a, type(a))
#print(b, type(b))
print(a.I*b)
结果2:
[[ 4.71428571]
[ 1.14285714]
[-1.42857143]]
计算方法3(最小二乘法,求误差最小的一组):
import numpy as np
A = np.mat('1 3 5;2 1 6;1 1 2')
B = np.mat('1;2;3')
X = np.linalg.lstsq(A, B)
print(X)
print('---------------')
print(X[0])
结果3:
(matrix([[ 4.71428571],
[ 1.14285714],
[-1.42857143]]), matrix([], shape=(1, 0), dtype=float64), 3, array([ 8.88272389, 1.69756102, 0.46422282]))
---------------
[[ 4.71428571]
[ 1.14285714]
[-1.42857143]]
计算方法4(求唯一解):
import numpy as np
A = np.mat('1 3 5;2 1 6;1 1 2')
B = np.mat('1;2;3')
X = np.linalg.solve(A, B)
print(X)
结果4:
[[ 4.71428571]
[ 1.14285714]
[-1.42857143]]