matrix是array的乙個小的分支,包含於array。所以matrix 擁有array的所有特性。
但在陣列乘和矩陣乘時,兩者各有不同,如果a和b是兩個matrices,那麼a*b,就是矩陣積
如果a,b是陣列的話,則a*b是陣列的運算
1.對陣列的操作
>>> import numpy as np
>>> a=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> b=a.copy()
>>> b
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a+b#多維陣列的加減,按對應位置操作
array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
>>> a*3#多維陣列乘常數,則對陣列中每乙個元素乘該常數
array([[ 3, 6, 9],
[12, 15, 18],
[21, 24, 27]])
>>> np.dot(a,b)#陣列的點乘運算通過np.dot(a,b)來實現,相當於矩陣乘
array([[ 30, 36, 42],
[ 66, 81, 96],
[102, 126, 150]])
>>> c=np.array([1,2,3])#構造一行三列的陣列
>>> c
array([1, 2, 3])
>>> c*a#c為一行三列,放於陣列a之前,則對陣列a中每行對應位置相乘
array([[ 1, 4, 9],
[ 4, 10, 18],
[ 7, 16, 27]])
>>> a*c#c為一行三列,放於陣列a之後,依舊是對陣列a中每行對應位置相乘
array([[ 1, 4, 9],
[ 4, 10, 18],
[ 7, 16, 27]])
>>> #如果想要矩陣運算,則需要np.dot()函式
>>> np.dot(c,a)#c為一行三列,放於陣列a之前,按正常矩陣方式運算
array([30, 36, 42])
>>> np.dot(a,c)#c為一行三列,放於陣列a之後,相當於矩陣a乘以3行一列的c矩陣,返回結果值不變,格式為1行3列
array([14, 32, 50])
>>> #將c改為多行一列的形式
>>> d=c.reshape(3,1)
>>> d
array([[1],
[2],
[3]])
>>> #
>>> np.dot(a,d)#值與np.dot(a,c)一致,但格式以改變為3行1列
array([[14],
[32],
[50]])
>>> a*a#陣列使用*的運算其結果屬於陣列運算,對應位置元素之間的運算
array([[ 1, 4, 9],
[16, 25, 36],
[49, 64, 81]])
>>> #但是不能更改a,d點乘的位置,不符合矩陣運算格式
>>> np.dot(d,a)
traceback (most recent call last):
file "", line 1, in np.dot(d,a)
valueerror: shapes (3,1) and (3,3) not aligned: 1 (dim 1) != 3 (dim 0)
2.對矩陣的操作
>>> a=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a=np.mat(a)
>>> a
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> b=a
>>> b
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a+b#矩陣的加減運算和陣列運算一致
matrix([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
>>> a-b
matrix([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
>>> a*b#矩陣的乘用*即可表示
matrix([[ 30, 36, 42],
[ 66, 81, 96],
[102, 126, 150]])
>>> np.dot(a,b)#與*一致
matrix([[ 30, 36, 42],
[ 66, 81, 96],
[102, 126, 150]])
>>> b*a
matrix([[ 30, 36, 42],
[ 66, 81, 96],
[102, 126, 150]])
>>> np.dot(b,a)
matrix([[ 30, 36, 42],
[ 66, 81, 96],
[102, 126, 150]])
>>> c=np.array([1,2,3])#構造一行三列陣列
>>> c
array([1, 2, 3])
>>> c*a#矩陣運算
matrix([[30, 36, 42]])
>>> a*c#不合矩陣規則
traceback (most recent call last):
file "", line 1, in a*c
file "f:\python3\anzhuang\lib\site-packages\numpy\matrixlib\defmatrix.py", line 309, in __mul__
return n.dot(self, asmatrix(other))
valueerror: shapes (3,3) and (1,3) not aligned: 3 (dim 1) != 1 (dim 0)
>>> np.dot(c,a)#和矩陣運算一致
matrix([[30, 36, 42]])
>>> np.dot(a,c)#自動將a轉換成3行1列參與運算,返回結果格式已經變為1行3列而非3行一列的矩陣
matrix([[14, 32, 50]])
>>> c=c.reshape(3,1)
>>> c
array([[1],
[2],
[3]])
>>> a*c#和矩陣運算一致
matrix([[14],
[32],
[50]])
>>> c*a#不合矩陣運算格式
traceback (most recent call last):
file "", line 1, in c*a
valueerror: shapes (3,1) and (3,3) not aligned: 1 (dim 1) != 3 (dim 0)
矩陣運算的另乙個好處就是方便於求轉置,求逆,求跡
>>> a
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> a.t
matrix([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
>>> a.h#共軛轉置
matrix([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
>>> b=np.eye(3)*3
>>> b
array([[3., 0., 0.],
[0., 3., 0.],
[0., 0., 3.]])
>>> b=np.mat(b)
>>> b.i#求逆運算
matrix([[0.33333333, 0. , 0. ],
[0. , 0.33333333, 0. ],
[0. , 0. , 0.33333333]])
>>> np.trace(b)#求跡運算
9.0
python中陣列和矩陣乘法及使用總結(推薦)
matrix是array的乙個小的分支,包含於array。所以matrix 擁有array的所有特性。但在陣列乘和矩陣乘時,兩者各有不同,如果a和b是bvgdqc兩個matrices,那麼a b,就是矩陣積 如果a,b是陣列的話,則a b是陣列的運算 1.對陣列的操作 import numpy as...
numpy 陣列和矩陣的乘法
1.當為array的時候,預設d f就是對應元素的乘積,multiply也是對應元素的乘積,dot d,f 會轉化為矩陣的乘積,dot點乘意味著相加,而multiply只是對應元素相乘,不相加 2.當為mat的時候,預設d f就是矩陣的乘積,multiply轉化為對應元素的乘積,dot d,f 為矩...
python 矩陣乘法
1.列表作為資料結構 def matrixproduct a,b temp2 for i in range len a temp1 for j in range len b 0 total 0 for k in range len a 0 total a i k b k j return temp2...