Python學習(八)Matlab和Numpy異同

參考資料:python

https://github.com/lijin-THU/notes-python(相應實體書爲:《自學Python——編程基礎、科學計算及數據分析》)git

從Matlab到Numpygithub

1. Numpy和Matlab比較編程

2. array仍是matrix?(數組 VS 矩陣)數組

Numpy 中不只提供了 array 這個基本類型,還提供了支持矩陣操做的類 matrix,可是通常推薦使用數組array:dom

  • 不少 numpy 函數返回的是 array,不是 matrix
  • 在 array 中,逐元素操做和矩陣操做有着明顯的不一樣
  • 向量能夠不被視爲矩陣

具體說來:函數

  • *, dot(), multiply()
    • array* -逐元素乘法,dot() -矩陣乘法
    • matrix* -矩陣乘法,multiply() -逐元素乘法
  • 處理向量
    • array:形狀爲 1xN, Nx1, N 的向量的意義是不一樣的,相似於 A[:,1] 的操做返回的是一維數組shape爲(N,)),形狀爲 N一維數組的轉置還是本身自己
    • matrix:形狀爲 1xN, Nx1A[:,1] 返回的是二維 Nx1 矩陣
  • 高維數組
    • array支持大於2的維度
    • matrix:維度只能爲2
  • 屬性
    • array.T 表示轉置
    • matrix.H 表示複共軛轉置,.I 表示逆,.A 表示轉化爲 array 類型
  • 構造函數
    • arrayarray 函數接受一個(嵌套)序列做爲參數——array([[1,2,3],[4,5,6]])
    • matrixmatrix 函數額外支持字符串參數——matrix("[1 2 3; 4 5 6]")

其優缺點各自以下:spa

  • array3d

    • [GOOD] 一維數組既能夠當作列向量,也能夠當作行向量v 在 dot(A,v) 被當作列向量,在 dot(v,A) 中被當作行向量,這樣省去了轉置的麻煩
    • [BAD!] 矩陣乘法須要使用 dot() 函數,如: dot(dot(A,B),C) vs A*B*C
    • [GOOD] 逐元素乘法很簡單: A*B
    • [GOOD] 做爲基本類型,是不少基於 numpy 的第三方庫函數的返回類型
    • [GOOD] 全部的操做 *,/,+,**,... 都是逐元素的
    • [GOOD] 能夠處理任意維度的數據
    • [GOOD] 張量運算
  • matrixcode

    • [GOOD] 相似與 MATLAB 的操做
    • [BAD!] 最高維度爲2
    • [BAD!] 最低維度也爲2
    • [BAD!] 不少函數返回的是 array,即便傳入的參數是 matrix
    • [GOOD] A*B 是矩陣乘法
    • [BAD!] 逐元素乘法須要調用 multiply 函數
    • [BAD!] / 是逐元素操做

固然在實際使用中,兩者的使用取決於具體狀況。

兩者能夠互相轉化

  • asarray :返回數組
  • asmatrix(或者mat) :返回矩陣
  • asanyarray :返回數組或者數組的子類,注意到矩陣是數組的一個子類,因此輸入是矩陣的時候返回的也是矩陣

3. 類Matlab函數:ones, zeros, empty, eye, rand, repmat

注:一般這些函數返回值爲array;爲了獲得matrix返回值,可以使用matlib子模塊

 1 import numpy
 2 import numpy.matlib
 3 
 4 a = numpy.ones(7)
 5 print(a.shape)  #(7,)  6 print(type(a))  #<class 'numpy.ndarray'>
 7 
 8 a = numpy.matlib.ones(7)
 9 print(a.shape)  #(1,7) 10 print(type(a))  #<class 'numpy.matrixlib.defmatrix.matrix'>
  • mat函數將數組轉化爲矩陣:a = numpy.array([1,2,3]);b = numpy.mat(a)
  • 相似於利用matlib模塊生成矩陣,還有部分函數也被放到子模塊中了,如調用rand()函數須要使用numpy.random.rand()  // a = numpy.random.rand(10)

4. 等效操做

1 from numpy import *
2 import scipy.linalg
#如下linalg表明numpy.linalg,與scipy.linalg不一樣

MATLAB 與 Numpy 下標之間有這樣幾處不一樣

  • 1-base vs 0-base
  • () vs []
  • MATLABbeg(:step):end,包含結束值 end
  • Numpybeg:end(:step)不包含結束值 end

 

 

 

參考:http://wiki.scipy.org/NumPy_for_Matlab_Users#whichNotes

相關文章
相關標籤/搜索