矩阵基本运算#
创建矩阵#
# 行与行之间用分号隔开,行内的元素之间用空格隔开
>>> m = matrix('1 2 3;4 5 6;7 8 9')
>>> m
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
矩阵转置#
# 使用 transpose 来获取转置矩阵
>>> transpose(m)
matrix([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
# 使用 T 属性获取转置矩阵
>>> m.T
matrix([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
逆矩阵#
# inv
>>> m = matrix('1 1 2;-1 2 0;1 1 3')
>>> linalg.inv(m)
matrix([[ 2. , -0.33333333, -1.33333333],
[ 1. , 0.33333333, -0.66666667],
[-1. , 0. , 1. ]])
# I
>>> m = matrix('1 1 2;-1 2 0;1 1 3')
>>> m.I
matrix([[ 2. , -0.33333333, -1.33333333],
[ 1. , 0.33333333, -0.66666667],
[-1. , 0. , 1. ]])
分块矩阵#
>>> a = eye(2)
>>> b = a * 2
>>> bmat('a b;a b')
matrix([[ 1., 0., 2., 0.],
[ 0., 1., 0., 2.],
[ 1., 0., 2., 0.],
[ 0., 1., 0., 2.]])
斐波那契数列#
斐波那契数列的计算等价于矩阵的连乘
#计算斐波那契数列中的第8个数
>>> x = 8
>>> (matrix('1 1;1 0') ** (x-1))[0,0]
21
使用binet公式计算斐波那契数列
>>> sqrt5 = sqrt(5)
>>> phi = (1+sqrt5)/2
>>> rint((phi**x - (-1/phi)**x)/sqrt5)
21.0
线性代数#
numpy.linalg模块包含线性代数函数
求解 Ax=b 的线性方程组#
# 1x-2y+z=0
# 2y-8z=8
# -4x+5y+9z=-9
>>> A = matrix('1 -2 1;0 2 -8;-4 5 9')
>>> b = array([0,8,-9])
>>> x = linalg.solve(A,b)
>>> print x
[ 29. 16. 3.]
>>> print dot(A,x)
[[ 0. 8. -9.]]
特征值和特征向量#
设A为n阶矩阵,若存在常数λ及n维非零向量x,使得Ax=λx,则称λ是矩阵A的特征值,x是A属于特征值λ的特征向量
>>> a = matrix('-1 1 0;-4 3 0;1 0 2')
# eigvals()返回特征值
>>> linalg.eigvals(a)
array([ 2., 1., 1.])
# eig()返回一个元组,第一项为特征值,第二项为对应的特征向量(按列排放)
>>> linalg.eig(a)
(array([ 2., 1., 1.]), matrix([[ 0. , 0.40824829, 0.40824829],
[ 0. , 0.81649658, 0.81649658],
[ 1. , -0.40824829, -0.40824829]]))
#2 [0,0,1]
#1 [0.40824829,0.81649658,-0.40824829]
#验证
>>> dot(a,[0,0,1])
matrix([[0, 0, 2]])
>>> dot(2,[0,0,1])
array([0, 0, 2])
>>> dot(a,[0.40824829,0.81649658,-0.40824829])
matrix([[ 0.40824829, 0.81649658, -0.40824829]])
>>> dot(1,[0.40824829,0.81649658,-0.40824829])
array([ 0.40824829, 0.81649658, -0.40824829])
奇异值分解#
>>> m = matrix('4 11 14;8 7 -2')
>>> U,Sigma,V = linalg.svd(m)
>>> print Sigma
[ 18.97366596 9.48683298]
广义逆矩阵#
>>> m = matrix('4 11 14;8 7 -2')
>>> n = linalg.pinv(m)
>>> print m*n
[[ 1.00000000e+00 -5.41233725e-16]
[ -8.32667268e-17 1.00000000e+00]]
#近似单位阵
行列式计算#
>>> m = matrix('4 6;8 2')
>>> linalg.det(m)
-40.0