numpy中的matrix和array

array數組

numpy中最基本(默認)的類型是array,他的相關操做都是按元素操做的即用做數值計算當中(按元素操做有+,-,,/,*等)。相乘舉例:數組

from numpy  import *
    >>> a=array([1,2])
    >>> a
    array([1, 2])
    >>> b=array([2,3])
    >>> b
    array([2, 3])
    >>> c=a*b
    >>> c
    array([2, 6])
    >>> dot(a,b)
    8

兩個array的相乘*指的是對應元素的相乘;兩個array的dot表示矩陣的相乘。數據結構

  • 若a是array,則a.T表示轉置。
  • 把array轉換爲matrix用asmatrix()函數

  • 多數numpy函數返回的是array類型,不是matrix類型。spa

matrix矩陣

在numpy中的特殊類型,是做爲array的子類出現,因此繼承了array的全部特性而且有本身的特殊的地方,專門用來處理線性代數操做(*表示矩陣的相乘,可是對於兩個matrix的除/則表示對應元素的相除。)。乘法舉例如:code

繼承

`
    >>> m=mat([2,3])
    >>> m
    matrix([[2, 3]])
    >>> n=([1,2])
    >>> n
    [1, 2]
    >>> p=m*n

 Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 341, i
    n __mul__
        return N.dot(self, asmatrix(other))
    ValueError: objects are not aligned
    >>> dot(m,n)
    matrix([[8]])
    >>> multiply(m,n)
    matrix([[2,6]])
**  兩個matrix相乘*錯誤緣由是m的列不等於n的行,也即不對齊(aligned),若對齊了,則是對應元素的相乘,返回一個matrix;兩個matrix的*表示是兩個矩陣的相乘。兩個matrix的dot表示矩陣相乘。兩個matrix的multiply表示對應元素的相乘。**

 - matrix中.H,.A,.I表示共軛,轉置,逆矩陣。
 - 把matrix轉換爲array用asarray()
 - asanyarray()根據和你的輸入的類型保持一致。


## array和matrix的一個很難理解的點 ##
 這裏會涉及到rank的概念,在線性代數(math)rank表示秩,可是必須明確的是在numpy裏rank不是表示秩的概念,是表示維數的概念,這個理解的話須要看此文章:對於多維arrays的數據結構解釋:
[多維arrays數據結構理解][1]

這裏暫時理解爲秩,雖然這樣理解是錯誤的,可是能夠說的通一些事情。(在實際的array和matrix裏,英文裏介紹的關於rank就用線性代數的秩來理解,可是英文會出現dimensions等於多少等,要求matrix的dimesions必須爲2,這裏其實指的就是秩,dimensions纔是在numpy裏的真實的理解形式)

array要求秩爲1(N*1,1*N等)或者大於2
matrix要求秩必須爲2(rank必須爲2)

 - 下面是關於ndim和size的理解:
>>> a
    array([1, 2])
    >>> b
    array([[1, 2],
           [2, 3]])
    >>> c
    matrix([[1, 2, 3, 4],
            [2, 3, 4, 5]])
    >>> d
    array([[1, 2, 3, 4],
           [2, 3, 4, 5]])
    >>> e
    matrix([[1, 2, 3, 4],
            [2, 3, 4, 5],
            [3, 4, 5, 6]])
    >>> a.size
    2
    >>> a.ndim
    1
    >>> b.size
    4
    >>> b.ndim
    2
    >>> c.size
    8
    >>> c.ndim
    2
    >>> d.size
    8
    >>> d.ndim
    2
    >>> e.ndim
    2
    >>>e.size
    12
**這裏ndim就是求的是rank,因此會發現matrix的都是2,可是array的就會存在差別,須要計算等。size返回的是元素的個數**

 - 關於dim, shape, rank, dimension and axis in numpy的細節的問題理解:

[stackoverflow地址][2]



## 補充 ##
如何讓

M = matrix([123, [4]]) 
如何轉變爲 
array([1, 2, 3, 4])ip

比較優雅的辦法:

x=matrix(arange(12).reshape((3,4))) 

matrix([[ 0, 1, 2, 3], 
[ 4, 5, 6, 7], 
[ 8, 9, 10, 11]]) 
x.getA1() 
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) 
「`ci

總結

在運用中,仍是用array好點,array的惟一缺陷就是在表示矩陣的相乘時候,要用dot,而不是*。get

關於numpy裏的array和matrix的其他的操做函數,另見wiki地址:http://wiki.scipy.org/NumPy_for_Matlab_Usersit

相關文章
相關標籤/搜索