參考資料:
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-base
vs0-base
()
vs[]
MATLAB
:beg(:step):end
,包含結束值end
Numpy
:beg:end(:step)
,不包含結束值end
參考:http://wiki.scipy.org/NumPy_for_Matlab_Users#whichNotes