Python 矩陣相關

2022-01-24 01:08:17 字數 2878 閱讀 7359

python 中矩陣運算主要使用numpy庫。numpy的主要物件是同種元素的多維陣列。這是乙個所有的元素都是一種型別、通過乙個正整數索引的元素**(通常是元素是數字)。因此對於隨機查詢來說,比python自帶的list快很多。

在numpy裡面通常使用兩個變數:array和matrix。其實python標準類庫中也有array,但是它的功能相對numpy的少很多,所以不用。matrix是array的分支,matrix可以看做二維的array,array可以是多維,matrix和array在很多時候都是通用的。官方建議如果兩個都可以用,那就選擇array,因為array更靈活,速度更快,很多人把二維的array也翻譯成矩陣。但是matrix的優勢在於,它相對於array使用的符號更簡潔一些。

a = np.array([2,4,5,6,7])

如上建立了乙個1*5的一行5列的array,這就相當於乙個行向量(實際上不是,應該用np.array([[2,4,5,6,7]])建立)。

m = np.matrix([[1,2,4,5,6],[5,6,8,9,4]])

如上建立了乙個2*5的matrix,這就是乙個2*5的矩陣。

另外矩陣還可以通過這個建立:

m = np.mat([[1,2,4,5,6],[5,6,8,9,4]])

mat和matrix的相關之處是,mat()就等同於matrix(,copy=false),而matrix()實際上預設copy=true。

所以如果想引用乙個矩陣,如m,可以使用a = mat(m),或者a = matrix(m,copy=false)。當然用列表來新建立乙個矩陣的時候它們是完全一樣的。

m = m.transpose()

m = m.t

matrix和除一維外的array可以通過這個兩個進行轉置(t和transpose不同點暫時不研究了)。

對於一維的array,它不是矩陣,也不是向量,所以不能通過transpose來轉置。因為在計算機裡,二維和一維定義好以後就確定下來用幾個索引標誌來索引了。而向量從功能上來看,應該被看做1行或1列的矩陣,所以它應該是二維的。就是說我們索引它的某個元素,比如行向量a的第3個元素,我們應該用a[0][3],而不是a[3]。所以a = np.array([2,4,5,6,7])建立的其實啥也不是,像np.array([[2,4,5,6,7]])這樣建立二維的才算真正意義上的行向量,也就能用transpose()來轉置了。

如果用a = np.array([2,4,5,6,7,1,3,8])建立了一行陣列a,想變成向量,要先用reshape()函式將它變成二維向量。

x = np.transpose(x,(2,0,1))

以上例子是對三維張量x進行轉置,(2,0,1)的意思是:將張量從(x,y,z)軸轉置為(z,x,y)軸。也就是說,如果張量x的形狀是[2,3,4],轉換後就變成了[4,2,3]。

轉置效果實際上就是將張量各個軸的順序改變,而張量內部元素在各個軸上的索引並不會改變。也就是說,x內部有個元素索引是x[1,2,3],經過以上轉置,它的索引變為了x[3,1,2],在各個軸上的索引沒變,只是變了順序。

如果不填元組引數:

x = np.transpose(x)

等價於:

x = np.transpose(x,(2,1,0))

也就是直接將三個軸順序倒序。

更高維的張量類似。

reshape()將一定規模的陣列從乙個形狀改為另乙個形狀,並且不論你怎麼改變形狀,陣列中元素的先後位置都是從一開始就確定的。用法如下:

a = np.ones([8])

a = a.reshape([2,2,2])

將原本為一維的向量a變成了2*2*2的三維立方陣。如果將a賦值給乙個新變數b:

b = a.reshape([2,2,2])
a的shape不變,b是2*2*2的立方陣,而且它們共享記憶體,即當a改變它的元素值時,b中對應的元素也會改變。另外,因為陣列的規模是固定的,因此可以有乙個維度為未知,輸入-1:

b = a.reshape([2,2,-1])
這樣的效果和上面是一致的。

乘法有三種表達方式:*、dot()、multiply()

陣列或矩陣的對應位置元素相乘。

對於一維陣列array,執行對應位置相乘,然後再求和;對於秩不為1的二維陣列(array)、矩陣(matrix),執行矩陣乘法運算(超過二維的可以參考numpy庫介紹)

對陣列array執行對應位置元素相乘(相當於 np.multiply() 函式),對矩陣matrix執行矩陣乘法運算(相當於 np.dot() 函式)。就是multiply()和dot()的融合。

相當於多個array或matrix執行*,即a**3=a*a*a。

multiply()全都是對應元素相乘;dot()是矩陣乘法,而一維array是對應元素相乘後之和;*對array是對應元素相乘,對matrix是矩陣乘法。

相對來說matrix注重矩陣操作,array注重陣列操作(陣中元素對應進行運算)

np.linalg.eig(a)

返回矩陣a的特徵值和特徵向量陣列:

np.linalg.eig(a)[0]是特徵值陣列,沒有大小順序;

np.linalg.eig(a)[1]是特徵向量,與特徵值陣列相對應。

Python 矩陣相關

python 中矩陣運算主要使用numpy庫。numpy的主要物件是同種元素的多維陣列。這是乙個所有的元素都是一種型別 通過乙個正整數索引的元素 通常是元素是數字 因此對於隨機查詢來說,比python自帶的list快很多。在numpy裡面通常使用兩個變數 array和matrix。其實python標...

矩陣相關總結

有可逆矩陣p,q,使得 paq b 有可逆矩陣p,使得 pap b 求對角矩陣就是求特徵值和特徵向量 有a,b兩個n階方陣,如有非奇異n階方陣c,使得b c tac a ta e,a t a u hau t或者 a utu h u h在實數域上就是指轉置 lambda a i preceq a pr...

矩陣運算相關問題

hoj1575 1 問題 給定乙個n n的方陣 2 n 10 計算這個矩陣的k次方的跡 2 k 1000000000 模9973 2 要點 無 hoj4920 1 問題 給定兩個n n矩陣 1 n 800 計算這兩個矩陣的乘積,模3 2 要點 將初始矩陣模3之後會有比較多的0元素,有利於提供矩陣的乘...