參考資料:
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, Nx1,A[:,1]返回的是二維Nx1矩陣
- 高維數組
array:支持大於2的維度matrix:維度只能為2
- 屬性
array:.T表示轉置matrix:.H表示復共軛轉置,.I表示逆,.A表示轉化為array類型
- 構造函數
array:array函數接受一個(嵌套)序列作為參數——array([[1,2,3],[4,5,6]])matrix:matrix函數額外支持字符串參數——matrix("[1 2 3; 4 5 6]")
其優缺點各自如下:
-
array[GOOD]一維數組既可以看成列向量,也可以看成行向量。v在dot(A,v)被看成列向量,在dot(v,A)中被看成行向量,這樣省去了轉置的麻煩[BAD!]矩陣乘法需要使用dot()函數,如:dot(dot(A,B),C)vsA*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-basevs0-base()vs[]MATLAB:beg(:step):end,包含結束值endNumpy:beg:end(:step),不包含結束值end






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