简介
下面简单总结python中矩阵的常用运算。
重要注释:在numpy中既可以用二维数组(numpy.ndarray)来表示矩阵,也可用numpy.matrix来表示矩阵。但我统一选择用ndarray来表示矩阵。
原因:
- ndarray更通用,可以表示任意N维数组;matrix其实只是ndarray的一个子类,不过实现了一些常用的矩阵操作;
- 官方文档不推荐用matrix,可能会在未来版本中移除matrix;
- 以前用matrix的一个好处是,可以直接用
a*b
进行矩阵乘法,而ndarray需要用np.dot(a,b)
。但在较新版本中(Python 3.5+,NumPy 1.10+),引入了@
运算符,即对于二维数组(ndarray),可以直接用a@b
进行矩阵乘法。
矩阵按元素相乘
方法:a*b
或np.multiply(a,b)
实例:
In [37]: a
Out[37]:
array([[ 1, 0],
[ 0, -1]])
In [38]: b = np.array([[0,1],[1,0]])
In [39]: b
Out[39]:
array([[0, 1],
[1, 0]])
In [41]: a*b
Out[41]:
array([[0, 0],
[0, 0]])
In [42]: np.multiply(a,b)
Out[42]:
array([[0, 0],
[0, 0]])
矩阵乘法
方法:a@b
或者np.dot(a,b)
实例:
In [43]: a = np.diag([1,-1])
In [44]: b = np.array([[0,1],[1,0]])
In [45]: a@b
Out[45]:
array([[ 0, 1],
[-1, 0]])
In [46]: np.dot(a,b)
Out[46]:
array([[ 0, 1],
[-1, 0]])
注意:np.dot(a,b)
使用说明:
- 当a和b都为2维数组(矩阵)时,进行矩阵乘法
- 当a和b都为1维数组时,进行内积运算,等价于
np.sum(a*b)
矩阵的指数运算
方法:scipy.linalg.expm(a)
实例:
In [29]: a = np.array([[0,1],[1,0]])
In [30]: expm(-1j/2*np.pi*a) #先导入, from scipy.linalg import expm
Out[30]:
array([[0.+0.j, 0.-1.j],
[0.-1.j, 0.+0.j]])
矩阵的共轭、转置、共轭转置
a为2维数组(ndarray)
共轭
方法:a.conj()
或np.conj(a)
转置
方法:a.T
或a.transpose()
共轭转置
未找到直接方法,可用a.conj().T
或a.T.conj()
实例
In [130]: x = np.array([[1+1j,1-1j],[1+1j,1-1j]])
In [131]: x
Out[131]:
array([[1.+1.j, 1.-1.j],
[1.+1.j, 1.-1.j]])
In [132]: x.T
Out[132]:
array([[1.+1.j, 1.+1.j],
[1.-1.j, 1.-1.j]])
In [133]: x.conj()
Out[133]:
array([[1.-1.j, 1.+1.j],
[1.-1.j, 1.+1.j]])
In [134]: x.T.conj()
Out[134]:
array([[1.-1.j, 1.-1.j],
[1.+1.j, 1.+1.j]])
In [135]: x.conj().T
Out[135]:
array([[1.-1.j, 1.-1.j],
[1.+1.j, 1.+1.j]])
矩阵求逆
方法:np.linalg.inv(a)
实例:
In [8]: a = np.array([[1,2],[3,4]])
In [9]: np.linalg.inv(a)
Out[9]:
array([[-2. , 1. ],
[ 1.5, -0.5]])
In [10]: np.linalg.inv(a)@a
Out[10]:
array([[1.0000000e+00, 4.4408921e-16],
[0.0000000e+00, 1.0000000e+00]])
矩阵的本征值
方法: w,v = np.linalg.eig(a)
注意:
- w为本征值array,它是无序的
- v为矩阵,每一列表示一个归一化的本征向量,v[:,i]对应w[i]
实例:
In [17]: a = np.array([[1,0],[0,-1]])
In [18]: w,v=np.linalg.eig(a)
In [19]: w
Out[19]: array([ 1., -1.])
In [20]: v
Out[20]:
array([[1., 0.],
[0., 1.]])
矩阵的迹(trace)
方法: a.trace()
或np.trace(a)
,等价于np.sum(np.diag(a))
实例:
In [26]: a = np.arange(1,5).reshape((2,2))
In [27]: a
Out[27]:
array([[1, 2],
[3, 4]])
In [28]: a.trace()
Out[28]: 5
In [29]: np.trace(a)
Out[29]: 5
矩阵的张量积
方法: np.kron(a,b)
实例:
In [21]: a = np.array([[1,0],[0,0]])
In [22]: b = np.array([[0,0],[0,1]])
In [23]: np.kron(a,b)
Out[23]:
array([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])