Matlab user 轉 Python 筆記(1):初遇Numpy
花了兩天看完莫煩老師的視頻網站:莫煩 Python(數據處理),教學簡單易懂,強烈推薦!!但是實戰起來,總是被困在Matlab的思維框架裡面。
直到,淘到了這篇文章!!! NumPy_for_Matlab_Users - SciPy wiki dump
裡面的 Matlab 和 Python 的命令對照表,簡直神器!!!還沒有熟練 Python 的同學,可以在編程的時候打開這個對照表,突然就能感覺到進步神速!!
下面主要說一下個人的學習心得吧。
以後回顧的時候可以給這篇重寫一個標題:那些年我走過的坑(淚目)
一、工具
下面的代碼練習,使用到的工具是 Jupyter Notebook
如果你使用的是Python的IDE:Anaconda,那麼
其他請參照:Installing Jupyter(官網)打開Jupyter Notebook,啟動一個命令窗口,彈出一個網頁
在以後的操作過程中,請不要關閉命令窗口!!!
新建一個文件夾,專門用作練習。例如,我創建了一個numpy的文件夾。
點擊文件夾numpy進入,新建一個空白文件,用於測試代碼。
輸入代碼的界面如下
Jupyter的好處是,它就像是一張草稿紙,可以反覆修改,直接輸出局部結果!!強烈推薦!!
Shift + Enter(回車) 即可快速運行局部框內的代碼。
下面涉及Python的代碼,都是在Jupyter上完成的。
二、數據
首先,Matlab是專為矩陣設計,所以一般我們用到的數據類型,就是矩陣。
上面就是一個矩陣。除此之外,我們可能還會用到元胞數組 { },結構體sturct()
對比之下,Python的數據類型非常豐富,序列(列表 list 和元組 tuple),映射(如字典dict),集合(set)
可以看到,基礎的Python里,沒有將矩陣作為一個單獨的類別。
為了實現矩陣運算的功能,我們需要引入Python的科學計算庫——Numpy,並且經常會配合Scipy,Pandas 庫一起使用。
NumPy 是一個定義了數值數組和矩陣類型和它們的基本運算的語言擴展。
pandas 是基於 Numpy 構建的含有更高級數據結構和工具的數據分析包。
SciPy 是另一種使用NumPy來做高等數學、信號處理、優化、統計和許多其它科學任務的語言擴展。
這幾個包綜合使用,基本可以覆蓋我們常用的Matlab的計算功能。
由於不是原生的,為了使用這些擴展包,我們需要在文件的開頭引入它們!!
import numpy as np # 引入numpy包,並且以np代指numpy
引入之後,如果我們要使用 numpy 包中定義的方法,
np.array([[1,2,3], [2,3,4]])
np.array : 首先聲明使用的是 numpy 的包,然後調用 numpy 包中的 array 方法。
假設,numpy 包中有方法 X,X是一個大類,其包含了三種方法x1,x2,x3,如果我想使用方法 x1,調用方法:
np.X.x1()
如果你使用過matlab的GUI,這種層級的調用方式可能會更容易理解。
一開始我就是經常忘記申明 np,不斷報錯,哭死,,,
完整代碼
import numpy as npprint(np.array([[1,2,3], [2,3,4]]))
這樣就構建好一個矩陣啦~~
注意觀察矩陣的形式,和Matlab的區別哦~
三、特殊矩陣生成
分清楚了 Matlab 和 Python 中 矩陣表示 的區別,下面我們就來看一下矩陣生成在Python中是如何實現。這時候就要打開我們的對照表了。
我稍微整理了一下:
(1)建立指定元素的矩陣
np.array([[1.,2.,3.],[4.,5.,6.]])
也可以指定數字的類型
np.array([[1.,2.,3.],[4.,5.,6.]],dtype=int) # 指定元素類型為整數,可省略
(2)建立全 0 的矩陣
np.zeros((3,4)) # 3行4列的全零矩陣
注意,由於zeros(shape,dtype),省略了dtype,所以shape (3,4)外面還有一層括弧。
(3)建立全 1 的矩陣
np.ones((3,4)) # 3行4列的全一矩陣
(4)建立全是n的矩陣
3*np.ones((3,4)) # 生成全是3的矩
(5)建立對角矩陣
np.eye(3) # 3行3列對角為1的矩陣
eye ( 行數,列數【默認=None】,對角線位置【默認=0】)
(6)指定對角線元素np.diag((1,2,3)) # 3行3列矩陣,指定對角元素為1,2,3
其他不再列舉。
四、生成規則數列
關於計數的,Python和Matlab的一個重要區別是:
Python 從 0 開始計數; Matlab 從 1 開始計數。
1、生成 1:10
np.arange(1,11,1) # 注意,結尾是11
arange(起點,終點,步長)
或者,
np.r_[1:11:1]
2、生成 0:9
np.arange(10)
或者
np.r_[:10]
3、等分區間(包含起點終點)
np.linspace(1,10,10)
linspace(起點,終點,等分個數)
或者
np.r_[1:10:10j] # 加上起點和終點,等分成10個數字
五、生成隨機數
np.random.rand(3,4) # 生成3行4列的隨機數
六、動態生成矩陣
在不確定矩陣大小的情況下,matlab中比較常用的是定義一個空矩陣,然後合併行/列
在Python中為了實現同樣的目的:方法一、
import numpy as npmylist = [] for item in np.random.rand(3,4): mylist.append(item) # 用一個for循環,不斷在後面添加itemprint(np.array(mylist)) # 用到了np.array()
import numpy as npa=np.empty(shape=[0, 4]) # 定義一個空矩陣 a,行為0,列為4b=np.random.rand(1,4) # 定義一個行為1,列為4的隨機數列bprint(np.append(a,b,axis=0)) # 縱向合併a,b
七、矩陣的描述
1、行列數
np.shape(a)
2、元素總個數
np.size(a) # 區別於matlab的size,等同於length
3、矩陣維度
np.ndim(a) # 二維矩陣,N維矩陣??
八、矩陣運算
由於Matlab是專為矩陣設計,所以對應元素相乘(非矩陣乘法),我們需要用點乘;
而Python恰好相反,對應元素的加減乘除,無須特殊標識。
如 ,對應元素相乘
a * b
矩陣乘法:
np.dot(a,b)
N次方:
a**3 # 3次方
九、矩陣賦值
由於Python 從 0 開始計數,在指定索引的時候要特別注意!
a[行索引,列索引]=值
或者,我們指定某一條件的數據,統一賦值
a[a>?]=值
其他內容就不再舉例了。
如果大家還有什麼問題,可以留言給我,再做補充。
再貼一遍神器:NumPy_for_Matlab_Users - SciPy wiki dump
好了,今天的內容就到這裡,希望對你有用 :)
最近工作比較忙,更新會很慢,下次預計更新pandas的內容,同樣 for matlab user~
推薦閱讀:
※學習numpy庫
※Numpy中arr[:]和arr[...],arr[:,i,j] 與arr[:][i][j]的區別?
※pandas的數據結構之Series
※ImagePy教程 —— 直方圖調整
※ImagePy教程 —— 形態學