python矩阵_Python 矩阵相关
Python 中矩陣運(yùn)算主要使用numpy庫。NumPy的主要對(duì)象是同種元素的多維數(shù)組。這是一個(gè)所有的元素都是一種類型、通過一個(gè)正整數(shù)索引的元素表格(通常是元素是數(shù)字)。因此對(duì)于隨機(jī)查找來說,比python自帶的list快很多。
在numpy里面通常使用兩個(gè)變量:array和matrix。其實(shí)python標(biāo)準(zhǔn)類庫中也有array,但是它的功能相對(duì)numpy的少很多,所以不用。matrix是array的分支,matrix可以看做二維的array,array可以是多維,matrix和array在很多時(shí)候都是通用的。官方建議如果兩個(gè)都可以用,那就選擇array,因?yàn)閍rray更靈活,速度更快,很多人把二維的array也翻譯成矩陣。但是matrix的優(yōu)勢在于,它相對(duì)于array使用的符號(hào)更簡潔一些。
矩陣和向量的創(chuàng)建
a = np.array([2,4,5,6,7])
如上創(chuàng)建了一個(gè)1*5的一行5列的array,這就相當(dāng)于一個(gè)行向量(實(shí)際上不是,應(yīng)該用np.array([[2,4,5,6,7]])創(chuàng)建)。
m = np.matrix([[1,2,4,5,6],[5,6,8,9,4]])
如上創(chuàng)建了一個(gè)2*5的matrix,這就是一個(gè)2*5的矩陣。
另外矩陣還可以通過這個(gè)創(chuàng)建:
m = np.mat([[1,2,4,5,6],[5,6,8,9,4]])
mat和matrix的相關(guān)之處是,mat([])就等同于matrix([],copy=false),而matrix([])實(shí)際上默認(rèn)copy=true。
所以如果想引用一個(gè)矩陣,如m,可以使用a = mat(m),或者a = matrix(m,copy=false)。當(dāng)然用[]列表來新創(chuàng)建一個(gè)矩陣的時(shí)候它們是完全一樣的。
轉(zhuǎn)置
m = m.transpose()
m = m.T
matrix和除一維外的array可以通過這個(gè)兩個(gè)進(jìn)行轉(zhuǎn)置(T和transpose不同點(diǎn)暫時(shí)不研究了)。
對(duì)于一維的array,它不是矩陣,也不是向量,所以不能通過transpose來轉(zhuǎn)置。因?yàn)樵谟?jì)算機(jī)里,二維和一維定義好以后就確定下來用幾個(gè)索引標(biāo)志來索引了。而向量從功能上來看,應(yīng)該被看做1行或1列的矩陣,所以它應(yīng)該是二維的。就是說我們索引它的某個(gè)元素,比如行向量a的第3個(gè)元素,我們應(yīng)該用a[0][3],而不是a[3]。所以a = np.array([2,4,5,6,7])創(chuàng)建的其實(shí)啥也不是,像np.array([[2,4,5,6,7]])這樣創(chuàng)建二維的才算真正意義上的行向量,也就能用transpose()來轉(zhuǎn)置了。
如果用a = np.array([2,4,5,6,7,1,3,8])創(chuàng)建了一行數(shù)組a,想變成向量,要先用reshape()函數(shù)將它變成二維向量。
高維張量轉(zhuǎn)置
x = np.transpose(x,(2,0,1))
以上例子是對(duì)三維張量x進(jìn)行轉(zhuǎn)置,(2,0,1)的意思是:將張量從(x,y,z)軸轉(zhuǎn)置為(z,x,y)軸。也就是說,如果張量x的形狀是[2,3,4],轉(zhuǎn)換后就變成了[4,2,3]。
轉(zhuǎn)置效果實(shí)際上就是將張量各個(gè)軸的順序改變,而張量內(nèi)部元素在各個(gè)軸上的索引并不會(huì)改變。也就是說,x內(nèi)部有個(gè)元素索引是x[1,2,3],經(jīng)過以上轉(zhuǎn)置,它的索引變?yōu)榱藊[3,1,2],在各個(gè)軸上的索引沒變,只是變了順序。
如果不填元組參數(shù):
x = np.transpose(x)
等價(jià)于:
x = np.transpose(x,(2,1,0))
也就是直接將三個(gè)軸順序倒序。
更高維的張量類似。
reshape()函數(shù)
reshape()將一定規(guī)模的數(shù)組從一個(gè)形狀改為另一個(gè)形狀,并且不論你怎么改變形狀,數(shù)組中元素的先后位置都是從一開始就確定的。用法如下:
a = np.ones([8])
a= a.reshape([2,2,2])
將原本為一維的向量a變成了2*2*2的三維立方陣。如果將a賦值給一個(gè)新變量b:
b = a.reshape([2,2,2])
a的shape不變,b是2*2*2的立方陣,而且它們共享內(nèi)存,即當(dāng)a改變它的元素值時(shí),b中對(duì)應(yīng)的元素也會(huì)改變。另外,因?yàn)閿?shù)組的規(guī)模是固定的,因此可以有一個(gè)維度為未知,輸入-1:
b = a.reshape([2,2,-1])
這樣的效果和上面是一致的。
矩陣乘法
乘法有三種表達(dá)方式:*、dot()、multiply()
np.multiply()
數(shù)組或矩陣的對(duì)應(yīng)位置元素相乘。
np.dot()
對(duì)于一維數(shù)組array,執(zhí)行對(duì)應(yīng)位置相乘,然后再求和;對(duì)于秩不為1的二維數(shù)組(array)、矩陣(matrix),執(zhí)行矩陣乘法運(yùn)算(超過二維的可以參考numpy庫介紹)
乘法運(yùn)算*
對(duì)數(shù)組array執(zhí)行對(duì)應(yīng)位置元素相乘(相當(dāng)于 np.multiply() 函數(shù)),對(duì)矩陣matrix執(zhí)行矩陣乘法運(yùn)算(相當(dāng)于 np.dot() 函數(shù))。就是multiply()和dot()的融合。
冪運(yùn)算**
相當(dāng)于多個(gè)array或matrix執(zhí)行*,即A**3=A*A*A。
總結(jié)
multiply()全都是對(duì)應(yīng)元素相乘;dot()是矩陣乘法,而一維array是對(duì)應(yīng)元素相乘后之和;*對(duì)array是對(duì)應(yīng)元素相乘,對(duì)matrix是矩陣乘法。
相對(duì)來說matrix注重矩陣操作,array注重陣列操作(陣中元素對(duì)應(yīng)進(jìn)行運(yùn)算)
矩陣特征值與特征向量
np.linalg.eig(A)
返回矩陣A的特征值和特征向量數(shù)組:
np.linalg.eig(A)[0]是特征值數(shù)組,沒有大小順序;
np.linalg.eig(A)[1]是特征向量,與特征值數(shù)組相對(duì)應(yīng)。
總結(jié)
以上是生活随笔為你收集整理的python矩阵_Python 矩阵相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matplotlib 横坐标只显示整数_
- 下一篇: 无法识别的配置节appsettings_