python numpy包---矩陣運算
阿新 • • 發佈:2019-02-19
下面簡要介紹Python和MATLAB處理數學問題的幾個不同點。1.MATLAB的基本是矩陣,而numpy的基本型別是多為陣列,把matrix看做是array的子類。2.MATLAB的索引從1開始,而numpy從0開始。
1.建立矩陣
a1=np.array([1,2,3],dtype=int)
#建立一個一維陣列,資料型別是int。也可以不指定資料型別,使用預設。幾乎所有的陣列建立函式都可以指定資料型別,即dtype的取值。 a2=np.array([[1,2,3],[2,3,4]])
#建立一個二維陣列。此處和MATLAB的二維陣列(矩陣)的建立有很大差別。 同樣,numpy中也有很多內建的特殊矩陣: b1=np.zeros((2,3))
#生成一個2行3列的全0矩陣。注意,引數是一個tuple:(2,3),所以有兩個括號。完整的形式為:zeros(shape,dtype=)。相同的結構,有ones()建立全1矩陣。empty()建立一個空矩陣,使用記憶體中的隨機值來填充這個矩陣。 b2=identity(n) #建立n*n的單位陣,這隻能是一個方陣。 b3=eye(N,M=None,k=0)
#建立一個對角線是1其餘值為0的矩陣,用k指定對角線的位置。M預設None。 此外,numpy中還提供了幾個like函式,即按照某一個已知的陣列的規模(幾行幾列)建立同樣規模的特殊陣列。這樣的函式有zeros_like()、empty_like()、ones_like(),它們的引數均為如此形式:zeros_like(a,dtype=),其中,a是一個已知的陣列。 c1=np.arange(2,3,0.1)
#起點,終點,步長值。含起點值,不含終點值。 c2=np.linspace(1,4,10)
#起點,終點,區間內點數。起點終點均包括在內。同理,有logspace()函式 d1=np.linalg.companion(a)
#伴隨矩陣 d2=np.linalg.triu()/tril()
#作用同MATLAB中的同名函式 e1=np.random.rand(3,2)
#產生一個3行2列的隨機陣列。同一空間下,有randn()/randint()等多個隨機函式 fliplr()/flipud()/rot90()
#功能類似MATLAB同名函式。 xx=np.roll(x,2)
#roll()是迴圈移位函式。此呼叫表示向右迴圈移動2位。 2.陣列的特徵資訊
先假設已經存在一個N維陣列X了,那麼可以得到X的一些屬性,這些屬性可以在輸入X和一個.之後,按tab鍵檢視提示。這裡明顯看到了Python面向物件的特徵。
X.flags #陣列的儲存情況資訊。
X.shape
#結果是一個tuple,返回本陣列的行數、列數、…… X.ndim #陣列的維數,結果是一個數 X.size #陣列中元素的數量 X.itemsize
#陣列中的資料項的所佔記憶體空間大小 X.dtype #資料型別 X.T #如果X是矩陣,發揮的是X的轉置矩陣 X.trace() #計算X的跡 np.linalg.det(a) #返回的是矩陣a的行列式 np.linalg.norm(a,ord=None)
#計算矩陣a的範數 np.linalg.eig(a)
#矩陣a的特徵值和特徵向量 np.linalg.cond(a,p=None)
#矩陣a的條件數 np.linalg.inv(a)
#矩陣a的逆矩陣 3.矩陣分解
常見的矩陣分解函式,numpy.linalg均已經提供。比如cholesky()/qr()/svd()/lu()/schur()等。某些演算法為了方便計算或者針對不同的特殊情況,還給出了多種呼叫形式,以便得到最佳結果。
4.矩陣運算
np.dot(a,b)用來計算陣列的點積;vdot(a,b)專門計算向量的點積,和dot()的區別在於對complex資料型別的處理不一樣;innner(a,b)用來計算內積;outer(a,b)計算外積。
專門處理矩陣的數學函式在numpy的子包linalg中定義。比如np.linalg.logm(A)計算矩陣A的對數。可見,這個處理和MATLAB是類似的,使用一個m字尾表示是矩陣的運算。在這個空間內可以使用的有cosm()/sinm()/signm()/sqrtm()等。其中常規exp()對應有三種矩陣形式:expm()使用Pade近似演算法、expm2()使用特徵值分析演算法、expm3()使用泰勒級數演算法。在numpy中,也有一個計算矩陣的函式:funm(A,func)。
5.索引
numpy中的陣列索引形式和Python是一致的。如:
x=np.arange(10)
print x[2]
#單個元素,從前往後正向索引。注意下標是從0開始的。 print x[-2]
#從後往前索引。最後一個元素的下標是-1 print x[2:5]
#多個元素,左閉右開,預設步長值是1 print x[:-7]
#多個元素,從後向前,制定了結束的位置,使用預設步長值 print x[1:7:2] #指定步長值 x.shape=(2,5)
#x的shape屬性被重新賦值,要求就是元素個數不變。2*5=10 print x[1,3]
#二維陣列索引單個元素,第2行第4列的那個元素 print x[0] #第一行所有的元素 y=np.arange(35).reshape(5,7)
#reshape()函式用於改變陣列的維度 print y[1:5:2,::2]
#選擇二維陣列中的某些符合條件的元素
#建立一個一維陣列,資料型別是int。也可以不指定資料型別,使用預設。幾乎所有的陣列建立函式都可以指定資料型別,即dtype的取值。 a2=np.array([[1,2,3],[2,3,4]])
#建立一個二維陣列。此處和MATLAB的二維陣列(矩陣)的建立有很大差別。 同樣,numpy中也有很多內建的特殊矩陣: b1=np.zeros((2,3))
#生成一個2行3列的全0矩陣。注意,引數是一個tuple:(2,3),所以有兩個括號。完整的形式為:zeros(shape,dtype=)。相同的結構,有ones()建立全1矩陣。empty()建立一個空矩陣,使用記憶體中的隨機值來填充這個矩陣。 b2=identity(n) #建立n*n的單位陣,這隻能是一個方陣。 b3=eye(N,M=None,k=0)
#建立一個對角線是1其餘值為0的矩陣,用k指定對角線的位置。M預設None。 此外,numpy中還提供了幾個like函式,即按照某一個已知的陣列的規模(幾行幾列)建立同樣規模的特殊陣列。這樣的函式有zeros_like()、empty_like()、ones_like(),它們的引數均為如此形式:zeros_like(a,dtype=),其中,a是一個已知的陣列。 c1=np.arange(2,3,0.1)
#起點,終點,步長值。含起點值,不含終點值。 c2=np.linspace(1,4,10)
#起點,終點,區間內點數。起點終點均包括在內。同理,有logspace()函式 d1=np.linalg.companion(a)
#伴隨矩陣 d2=np.linalg.triu()/tril()
#作用同MATLAB中的同名函式 e1=np.random.rand(3,2)
#產生一個3行2列的隨機陣列。同一空間下,有randn()/randint()等多個隨機函式 fliplr()/flipud()/rot90()
#功能類似MATLAB同名函式。 xx=np.roll(x,2)
#roll()是迴圈移位函式。此呼叫表示向右迴圈移動2位。 2.陣列的特徵資訊
#結果是一個tuple,返回本陣列的行數、列數、…… X.ndim #陣列的維數,結果是一個數 X.size #陣列中元素的數量 X.itemsize
#陣列中的資料項的所佔記憶體空間大小 X.dtype #資料型別 X.T #如果X是矩陣,發揮的是X的轉置矩陣 X.trace() #計算X的跡 np.linalg.det(a) #返回的是矩陣a的行列式 np.linalg.norm(a,ord=None)
#計算矩陣a的範數 np.linalg.eig(a)
#矩陣a的特徵值和特徵向量 np.linalg.cond(a,p=None)
#矩陣a的條件數 np.linalg.inv(a)
#矩陣a的逆矩陣 3.矩陣分解
#單個元素,從前往後正向索引。注意下標是從0開始的。 print x[-2]
#從後往前索引。最後一個元素的下標是-1 print x[2:5]
#多個元素,左閉右開,預設步長值是1 print x[:-7]
#多個元素,從後向前,制定了結束的位置,使用預設步長值 print x[1:7:2] #指定步長值 x.shape=(2,5)
#x的shape屬性被重新賦值,要求就是元素個數不變。2*5=10 print x[1,3]
#二維陣列索引單個元素,第2行第4列的那個元素 print x[0] #第一行所有的元素 y=np.arange(35).reshape(5,7)
#reshape()函式用於改變陣列的維度 print y[1:5:2,::2]
#選擇二維陣列中的某些符合條件的元素