Python學習(八)Matlab和Numpy異同


參考資料:

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

從Matlab到Numpy

1. Numpy和Matlab比較

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

Numpy 中不僅提供了 array 這個基本類型,還提供了支持矩陣操作的類 matrix,但是一般推薦使用數組array:

  • 很多 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]")

其優缺點各自如下:

  • array

    • [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] 張量運算
  • matrix

    • [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

 


免責聲明!

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



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