python數組和矩陣使用總結


python數組和矩陣使用總結

1、數組和矩陣常見用法

  • Python使用NumPy包完成了對N-維數組的快速便捷操作。使用這個包,需要導入numpy。
  • SciPy包以NumPy包為基礎,大大的擴展了numpy的能力。因此只要導入了scipy,不必在單獨導入numpy了!為了使用的方便,scipy包在最外層名字空間中包括了所有的numpy內容。
  • 本文還是區分numpy中實現的和scipy中實現的。
  • 以下默認已經:import numpy as np 以及 impor scipy as sp

numpy的基本類型是多維數組,把matrix看做是array的子類。

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]  #選擇二維數組中的某些符合條件的元素

 

2、數組和矩陣的區別:

參考http://blog.csdn.net/vincentlipan/article/details/20717163

Numpy matrices必須是2維的,但是 numpy arrays (ndarrays) 可以是多維的(1D,2D,3D····ND). Matrix是Array的一個小的分支,包含於Array。所以matrix 擁有array的所有特性。

在numpy中matrix的主要優勢是:相對簡單的乘法運算符號。例如,a和b是兩個matrices,那么a*b,就是矩陣積。

import numpy as np
a=np.mat('4 3; 2 1')  #
b=np.mat('1 2; 3 4')  #
print(a)
# [[4 3]
# [2 1]]

print(a*b)   #正常的矩陣積
# [[13 20]
# [ 5 8]]

 

matrix 和 array 都可以通過objects后面加.T 得到其轉置。但是 matrix objects 還可以在后面加 .H f得到共軛矩陣, 加 .I 得到逆矩陣。

相反的是在numpy里面arrays遵從逐個元素的運算,所以array:c 和d的c*d運算相當於matlab里面的c.*d運算。

c=np.array([[4, 3], [2, 1]])
d=np.array([[1, 2], [3, 4]])
print(c*d)  #對array來說,*意味着對應元素相乘
# [[4 6]
# [6 4]]

#而array應用矩陣乘法,則需要numpy里面的dot命令 :
print(np.dot(c,d))
# [[13 20]
# [ 5 8]]
** 運算符的作用也不一樣 :
print(a**2)
# [[22 15]
# [10 7]]
print(c**2)
# [[16 9]
# [ 4 1]]

#因為a是個matrix,所以a**2返回的是a*a,相當於矩陣相乘。而c是array,c**2相當於,c中的元素逐個求平方

問題就出來了,如果一個程序里面既有matrix 又有array,會讓人腦袋大。但是如果只用array,你不僅可以實現matrix所有的功能,還減少了編程和閱讀的麻煩。

兩者之間的轉換:

 np.asmatrix  和  np.asarray 

對我來說,numpy 中的array與numpy中的matrix,matlab中的matrix的最大的不同是,在做歸約運算時,array的維數會發生變化,但matrix總是保持為2維。例如下面求平均值的運算

>>> m = np.mat([[1,2],[2,3]])
>>> m
matrix([[1, 2],
[2, 3]])
>>> mm = m.mean(1)
>>> mm
matrix([[ 1.5],[ 2.5]])
>>> mm.shape
(2, 1)
>>> m - mm
matrix([[-0.5, 0.5], [-0.5, 0.5]])
對array 來說
>>> a = np.array([[1,2],[2,3]])
>>> a
array([[1, 2], [2, 3]])
>>> am = a.mean(1)
>>> am.shape (2,)
>>> am array([ 1.5, 2.5])
>>> a - am
#wrong array([[-0.5, -0.5],
[ 0.5, 0.5]])
>>> a - am[:, np.newaxis] #right
array([[-0.5, 0.5],[-0.5, 0.5]]

3、參考網站

numpy相關學習指南:https://github.com/rougier/numpy-tutorial

數組矩陣區別  http://blog.csdn.net/vincentlipan/article/details/20717163

科學計算:Python VS. MATLAB(3)----線性代數基礎   http://blog.sina.com.cn/s/blog_5f234d4701012p64.html

python的常見矩陣運算

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM