點(diǎn)積與乘法運(yùn)算符
Numpy的乘法運(yùn)算符*是按元素逐個運(yùn)算的缀程,與matlab不同。假設(shè)矩陣a(m,n) b(n,k),要求a的列數(shù)與b的行數(shù)相等才可進(jìn)行乘法運(yùn)算。
計算規(guī)則:a(m,n)*b(n,k)=c(m,k):
matlab環(huán)境下涵叮,基本運(yùn)算符按照矩陣乘法處理:
>> a=[1,2,3;2,2,4]
a =
1 2 3
2 2 4
>> b=[3;3;3]
b =
3
3
3
>> a*b
ans =
18
24
使用numpy運(yùn)算結(jié)果是按照矩陣的點(diǎn)積處理:
a = np.array([[1,2,3],[2,2,4]])
b= np.array([3,3,3])
a*b
Out[99]:
array([[ 3, 6, 9],
[ 6, 6, 12]])
矩陣乘法運(yùn)算需要使用dot函數(shù):
np.dot(a,b)
Out[100]:
array([18, 24])
矩陣轉(zhuǎn)置
矩陣轉(zhuǎn)置把矩陣的行和列互相交換。
matlab操作命令:
>> a=[1,3,2;2,1,5;6,3,1]
a =
1 3 2
2 1 5
6 3 1
>> a'
ans =
1 2 6
3 1 3
2 5 1
numpy操作:
a=np.array([[1,3,2],[2,1,5],[6,3,1]])
a.T
Out[116]:
array([[1, 2, 6],
[3, 1, 3],
[2, 5, 1]])
廣播(broadcasting)機(jī)制
假設(shè)對矩陣X的所有列加上一個向量伞插,基本實(shí)現(xiàn)思路可以是這樣:
import numpy as np
x = np.array([[1,2,4],[3,2,2],[4,2,5]])
v = [1,0,1]
y = np.empty_like(x)
for i in range(3):
y[i,:] = x[i,:]+v
y
Out[7]:
array([[2, 2, 5],
[4, 2, 3],
[5, 2, 6]])
對矩陣X的每一行進(jìn)行求和處理割粮,就可以算出最終結(jié)果。除此之外媚污,也可以用tile函數(shù)將向量按行復(fù)制成為與X具有相同shape的矩陣舀瓢,然后再進(jìn)行求和:
vv = np.tile(v,(3, 1))
vv
Out[10]:
array([[1, 0, 1],
[1, 0, 1],
[1, 0, 1]])
x+vv
Out[11]:
array([[2, 2, 5],
[4, 2, 3],
[5, 2, 6]])
但是,numpy提供的廣播機(jī)制可以簡化這種shape不同的數(shù)組或矩陣之間的基本運(yùn)算:
x+v
Out[12]:
array([[2, 2, 5],
[4, 2, 3],
[5, 2, 6]])
來看一個基本的例子:
v = np.array([1,2,3])
w = np.array([4,5])
np.reshape(v,(3,1))
Out[15]:
array([[1],
[2],
[3]])
np.reshape(v,(3,1))*w
Out[16]:
array([[ 4, 5],
[ 8, 10],
[12, 15]])
向量v在進(jìn)行reshape操作之后變成3x1的矩陣耗美,w是一個1x2的向量京髓,在進(jìn)行點(diǎn)積運(yùn)算時航缀,廣播機(jī)制就生效了,最終結(jié)果是一個3x2的矩陣朵锣。廣播機(jī)制的兩個基本原則:
- 廣播之后,輸出數(shù)組的shape是輸入數(shù)組shape的各個軸上的最大值甸私,然后沿著較大shape屬性的方向復(fù)制延伸诚些;
- 要進(jìn)行廣播機(jī)制,要么兩個數(shù)組的shape屬性一樣皇型,要么其中有一個數(shù)組的shape屬性必須有一個等于1诬烹。
見圖(來源:http://www.labri.fr/perso/nrougier/from-python-to-numpy/?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more#broadcasting):
numpy數(shù)組與矩陣
大部分情況下,numpy可以利用二維數(shù)組完成矩陣的基本操作弃鸦。二者可以通過mat函數(shù)進(jìn)行轉(zhuǎn)換:
x = np.array([[1,2,3],[2,3,2],[4,2,5]])
y = np.mat(x)
y
Out[46]:
matrix([[1, 2, 3],
[2, 3, 2],
[4, 2, 5]])
進(jìn)行基本求逆運(yùn)算:
x*y.I
Out[47]:
matrix([[ 1.00000000e+00, 0.00000000e+00, -5.55111512e-17],
[ -1.11022302e-16, 1.00000000e+00, -2.77555756e-17],
[ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
x*y.I - np.eye(3)
Out[49]:
matrix([[ -2.22044605e-16, 0.00000000e+00, -5.55111512e-17],
[ -1.11022302e-16, 0.00000000e+00, -2.77555756e-17],
[ 0.00000000e+00, 0.00000000e+00, -2.22044605e-16]])
x*y.I - (x*y.I - np.eye(3))
Out[50]:
matrix([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
I屬性即可取得矩陣的逆矩陣绞吁,二維數(shù)組不具有該屬性。逆矩陣與自身相乘得到的結(jié)果應(yīng)該是一個單位矩陣唬格,由于計算機(jī)的運(yùn)算誤差家破,對角線以外的位置產(chǎn)生了很多極小的誤差,因此減去一個同樣shape的單位矩陣就可以得到這個誤差值购岗,將運(yùn)算結(jié)果減去誤差就可以得到一個標(biāo)準(zhǔn)單位矩陣汰聋。