8.2 矩陣(Matrix)對象
Matrix類型繼承於ndarray類型,因此含有ndarray的所有數據屬性和方法。Matrix類型與ndarray類型有六個重要的不同點,當你當Matrix對象當arrays操作時,這些不同點會導致非預期的結果。
1)Matrix對象可以使用一個Matlab風格的字符串來創建,也就是一個以空格分隔列,以分號分隔行的字符串。
2)Matrix對象總是二維的。這包含有深遠的影響,比如m.ravel()的返回值是二維的,成員選擇的返回值也是二維的,因此序列的行為與array會有本質的不同。
3)Matrix類型的乘法覆蓋了array的乘法,使用的是矩陣的乘法運算。當你接收矩陣的返回值的時候,確保你已經理解這些函數的含義。特別地,事實上函數asanyarray(m)會返回一個matrix,如果m是一個matrix。
4)Matrix類型的冪運算也覆蓋了之前的冪運算,使用矩陣的冪。根據這個事實,再提醒一下,如果使用一個矩陣的冪作為參數調用asanarray(...)跟上面的相同。
5)矩陣默認的__array_priority__是10.0,因而ndarray和matrix對象混合的運算總是返回矩陣。
6)矩陣有幾個特有的屬性使得計算更加容易,這些屬性有:
(a) .T -- 返回自身的轉置
(b) .H -- 返回自身的共軛轉置
(c) .I -- 返回自身的逆矩陣
(d) .A -- 返回自身數據的2維數組的一個視圖(沒有做任何的拷貝)
Matrix類 是ndarray的一個Python子類,你也可以學習這個實現來構造自己的ndarray子類。Matrix對象也可以使用其它的Matrix對象,字 符串,或者其它的可以轉換為一個ndarray的參數來構造。另外,在NumPy里,“mat”是“matrix”的一個別名。
例1: 使用字符串構造矩陣
>>> from numpy import * >>> a=mat('1 2 3; 4 5 3') >>> print (a*a.T).I [[ 0.29239766 -0.13450292] [-0.13450292 0.08187135]] |
例2: 使用嵌套序列構造矩陣
>>> mat( [ [1,5,10],[1.0,3,4j] ]) matrix([[ 1.+0.j, 5.+0.j, 10.+0.j], [ 1.+0.j, 3.+0.j, 0.+4.j]]) |
例3: 使用一個數組構造矩陣
>>> mat( random.rand(3,3) ).T matrix([[ 0.81541602, 0.73987459, 0.03509142], [ 0.14767449, 0.60539483, 0.05641679], [ 0.43257759, 0.628695 , 0.47413553]]) |
Matrix( data, dtype=None, copy=True )
將 以參數data傳進來的數據轉換為矩陣。如果dtype是None,那么數據類型將由data的內容來決定。如果copy為True,則會拷貝data中 的數據,否則會使用原來的數據緩沖。如果沒有找到數據的緩沖區,當然也會進行數據的拷貝。注意:矩陣matrix事實上是一個類型,因此當你構造實例的時 候會調用matrix.__new__(matrix, data, dtype, copy)。
Mat
只是matrix的一個別名。
Asmatrix(data, dtype=None)
返回不經過復制的數據。等價於matrix(data, dtype, copy=False)。
Bmat(obj, ldict=None, gdict=None)
使用一個字符串,嵌套的序列或者一個數組(array)構造一個矩陣。這個命令允許你從其它的對象來建立起矩陣。其中當obj是一個字符串的時候才會使用參數ldict和gdict,這兩個參數是局部和模塊的字典。如果你沒有提供它們,這些將由系統提供。
>>> A=mat('2 2; 2 2'); B=mat('1 1; 1 1');
>>> print bmat('A B; B A')
[[2 2 1 1]
[2 2 1 1]
[1 1 2 2]
[1 1 2 2]]