Python中主要有两种表示矩阵的方法,一种是matrix类,另一种是二维array,主要区别在于默认的乘法不同,前者默认乘法是矩阵的乘法,后者默认乘法是Hadamard乘法。实际情况中我们使用后一种也就是二维array表示矩阵。
你可以用NumPy提供的专门的函数创建特殊的矩阵,也可以像二维数组那样提取矩阵中的某个元素或某行某列
1.矩阵创建-NumPy
In [1]: import numpy as np
In [2]: from numpy.linalg import inv
In [3]: #创建矩阵
In [4]: A = np.martrix([[1,2],[3,4],[5,6]])
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-5f430326d354> in <module>()
----> 1 A = np.martrix([[1,2],[3,4],[5,6]])
AttributeError: module 'numpy' has no attribute 'martrix'
In [5]: A = np.matrix([[1,2],[3,4],[5,6]])
In [6]: print(A)
[[1 2]
[3 4]
[5 6]]
In [8]: B = np.array(range(1,7)).reshape(3,2)
In [9]: print(B)
[[1 2]
[3 4]
[5 6]]
In [10]: A*A
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-10-cd6673b04447> in <module>()
----> 1 A*A
H:\Software\Anaconda\lib\site-packages\numpy\matrixlib\defmatrix.py in __mul__(self, other)
307 if isinstance(other, (N.ndarray, list, tuple)) :
308 # This promotes 1-D vectors to row vectors
--> 309 return N.dot(self, asmatrix(other))
310 if isscalar(other) or not hasattr(other, '__rmul__') :
311 return N.dot(self, other)
ValueError: shapes (3,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0)
In [11]: B*B
Out[11]:
array([[ 1, 4],
[ 9, 16],
[25, 36]])
In [12]: #创建特殊矩阵
In [13]: np.zeros((3,2))
Out[13]:
array([[0., 0.],
[0., 0.],
[0., 0.]])
In [14]: np.identity(3)
Out[14]:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
In [15]: np.diag([1,2,3])
Out[15]:
array([[1, 0, 0],
[0, 2, 0],
[0, 0, 3]])
In [16]: #矩阵向量提取
In [17]: m = np.array(range(1,10)).reshape(3,3)
In [18]: print(m)
[[1 2 3]
[4 5 6]
[7 8 9]]
In [19]: m[[0,2]]
Out[19]:
array([[1, 2, 3],
[7, 8, 9]])
In [20]: #提取列向量
In [21]: m[:,[1,2]] #或者 m[:,[False,True,False]]
Out[21]:
array([[2, 3],
[5, 6],
[8, 9]])
2. 矩阵的加减运算以及与数字的乘积与数字运算一样。当矩阵用二维array表示时,直接的乘号表示Hadamard乘积,矩阵的乘法需要使用dot函数。矩阵的转置由transpose函数完成,而逆矩阵由inv函数完成。
In [23]: import numpy as np
In [24]: from numpy.linalg import inv
In [25]: #矩阵的运算
In [26]: n = np.array(range(1,5)).reshape(2,2)
In [27]: n
Out[27]:
array([[1, 2],
[3, 4]])
In [28]: np.transpose(n)
Out[28]:
array([[1, 3],
[2, 4]])
In [29]: n+n
Out[29]:
array([[2, 4],
[6, 8]])
In [30]: n-n
Out[30]:
array([[0, 0],
[0, 0]])
In [31]: 3*n
Out[31]:
array([[ 3, 6],
[ 9, 12]])
In [32]: #Hadamard乘积
In [33]: n*n
Out[33]:
array([[ 1, 4],
[ 9, 16]])
In [34]: #矩阵乘积
In [35]: n.dot(n)
Out[35]:
array([[ 7, 10],
[15, 22]])
In [36]: #矩阵的逆矩阵
In [37]: inv(n)
Out[37]:
array([[-2. , 1. ],
[ 1.5, -0.5]])
In [38]: np.dot(inv(n),n)
Out[38]:
array([[1.0000000e+00, 4.4408921e-16],
[0.0000000e+00, 1.0000000e+00]])