python:矩阵(ndarray)的常用运算

简介

下面简单总结python中矩阵的常用运算。

重要注释:在numpy中既可以用二维数组(numpy.ndarray)来表示矩阵,也可用numpy.matrix来表示矩阵。但我统一选择用ndarray来表示矩阵。
原因:

  1. ndarray更通用,可以表示任意N维数组;matrix其实只是ndarray的一个子类,不过实现了一些常用的矩阵操作;
  2. 官方文档不推荐用matrix,可能会在未来版本中移除matrix
  3. 以前用matrix的一个好处是,可以直接用a*b进行矩阵乘法,而ndarray需要用np.dot(a,b)。但在较新版本中(Python 3.5+,NumPy 1.10+),引入了@运算符,即对于二维数组(ndarray),可以直接用a@b进行矩阵乘法。

矩阵按元素相乘

方法:a*bnp.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.Ta.transpose()

共轭转置
未找到直接方法,可用a.conj().Ta.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]])
  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值