Matlab user 轉 Python 筆記(1):初遇Numpy

寫在前面:Matlab編程2年,Python只在Django項目中接觸不多,最近決定系統得學習一下,主要以實戰為目的。這篇文章僅適用於,有matlab基礎,希望轉學Python的同學。如果有什麼不對的地方,跪求指正!!

花了兩天看完莫煩老師的視頻網站:莫煩 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

empty()較少用

七、矩陣的描述

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教程 —— 形態學

TAG:Python | MATLAB | numpy |