MATLAB 使用者的 Python


當我們從學術界轉向行業,特別是工程專業人士時,我們面臨著一個非常普遍的問題,那就是我們主要學習的是過時或即將過時的技術。例如,許多學校仍在使用 MATLAB。在工程領域,無論是化學工程師、電氣工程師還是奈米工程師,每個人都必須使用過 MATLAB。

但在最近,我們可以看到企業正在從 MATLAB 轉向 Python。這可能是由於各種原因造成的 -

  • 1000 美元的許可證費用

  • 記憶體分配效率低下

  • 開源庫匱乏

  • 討厭 MATLAB 語法。

想要從 MATLAB 切換到 Python 的人不必過於擔心,因為它們的語法非常相似。

讓我們針對 MATLAB 使用者介紹 Python 的基礎知識,重點關注資料分析和視覺化。

矩陣使用者的工具

NumPy 包含一些功能,使使用矩陣型別變得更容易,這應該有助於 MATLAB 的轉換。

  • 現在有一個 **matlib** 模組,其中包含用於流行陣列構造器的矩陣,例如

zeros(), ones(), empty(), rand(), eye(), and repmat()
  • 由於 mat 是 asmatrix 而不是矩陣的同義詞,因此現在可以將陣列轉換為矩陣而無需複製資料。

  • 一些頂級函式已被刪除。例如,必須將 *numpy.rand()* 訪問為 *numpy.random.rand()*。或者,使用 matlib 模組的 *rand()* 方法。但是,使用 *numpy.random.random()* 是“NumPythonic”方法,它與其他 NumPy 函式一樣,接受一個元組作為形狀。

對於那些理解簡單 MATLAB 語法的人,我們可以使用以下方法 -

mat = np.matrix('2,6,3;  0,2,5;  1,7,4')

但在 Python 邏輯中,我們使用向量或列表。因此,以下語法將等效 -

mat = np.matrix([[2,6,3], [0,2,5], [1,7,4]])

使用 Python 語言語法,我們可以輕鬆遍歷並獲取值。

例如,

示例

如果我們想獲取第一個,即 (0,0) 值,我們可以簡單地寫 *mat[0,0]*

import numpy as np
mat = np.matrix([
   [2,6,3],
   [0,2,5],
   [1,7,4]
])
print(mat[0,0])

輸出

2

示例

第一列可以訪問為 *mat[: , 0]* -

import numpy as np
mat = np.matrix([
   [2,6,3],
   [0,2,5],
   [1,7,4]
])
print(mat[: , 0])

輸出

[[2]
[0]
[1]]

示例

僅訪問第一行 -

import numpy as np
mat = np.matrix([
   [2,6,3],
   [0,2,5],
   [1,7,4]
])
print(mat[0,:])

輸出

[[2 6 3]]

MATLAB-NumPy 等價物

子矩陣

可以使用 **ix_** 命令使用索引列表將資料分配給子矩陣。

例如,可以輸入

index=[1,2];
matrix[np.ix_(index,index)]+=100

對於二維陣列矩陣。

示例

import numpy as np
mat = np.matrix([
   [2,6,3],
   [0,2,5],
   [1,7,4]
])
index=[1,2];
mat[np.ix_(index,index)]+=100
print(mat)

輸出

[[ 2 6 3]
[ 0 102 105]
[ 1 107 104]]

幫助

雖然 MATLAB 缺少 *which* 命令的直接等價物,但 *source* 和 *help* 命令通常會顯示儲存函式的位置的檔名。

此外,Python 包含一個 *inspect* 模組(要使用此模組,請匯入 inspect),它提供了一個通常有功能的 getfile。

索引

任何陣列/序列的第一個元素的索引為 1,因為 MATLAB 使用基於 1 的索引。

任何陣列/序列的第一個元素的索引為零,因為 Python 使用基於 0 的索引。

範圍

在 Python 中,像 0:5 這樣的構造只能用作切片索引;在 MATLAB 中,0:5 可以用作“切片”索引(在方括號內)和範圍文字(在括號內)。

因此,開發了古怪的 *r_ 物件*,以便 NumPy 能夠具有類似的簡潔範圍建立方法。

因為 r_ 物件使用方括號進行索引,而不是像函式或函式 Object() { [native code] } 一樣被呼叫,所以在引數中可以使用切片語法。

邏輯運算

在 MATLAB 中,| 和 & 是邏輯 AND/OR,而在 NumPy 中,& 或 | 是按位 AND/OR。

任何具有大量程式設計知識的人都可以區分這些差異。

儘管兩者看起來功能相同,但存在重大差異。

以下是 NumPy 和 MATLAB 中 & 和 | 運算子的一些關鍵區別 -

  • 形式為 0,1 的非邏輯輸入:NumPy 的輸出 = 輸入的按位 AND。

  • MATLAB 返回邏輯 AND 並將任何非 0 值視為 1。例如,在 NumPy 中 (3 & 4) 給出 0,而在 MATLAB 中 (3 & 4) 返回 1,因為 3 和 4 都被視為邏輯真。

  • MATLAB 的 & 運算子的優先順序低於小於 (<) 和大於 (>) 等邏輯運算子;NumPy 的優先順序相反。

如果您確定引數是布林值,請使用 NumPy 的按位運算子,但在使用括號時要小心,如下例所示 -

z = (x > 1) & (x 2)

Python 設計的一個不良副作用是 NumPy 中缺少邏輯與、邏輯或運算子形式。

重塑和線性索引

MATLAB 允許透過使用線性或標量索引來訪問多維陣列,而 NumPy 則不允許。

在 MATLAB 程式中,線性索引經常被使用。

在轉換 MATLAB 程式碼時,可能需要先將矩陣重塑為線性序列,執行一些基於索引的操作,然後再次重塑它。

鑑於重塑(通常)會建立對同一儲存區的檢視,因此應該能夠相當快地完成此操作。需要注意的是,MATLAB 在使用 reshape 函式時使用 Fortran 順序,而 NumPy 預設為 C 順序。如果您只是從一個線性序列更改為另一個線性序列,則這無關緊要。

資料繪圖

最後,當我們想要視覺化資料時,繪圖非常重要。Python 的 *Matplotlib* 函式提供了一套豐富的函式來執行繪圖操作。

import numpy as np
import matplotlib.pyplot as pltlib
mat = np.matrix([[1,1,1],[2,4,6],[5,7,6]])
pltlib.plot(mat[:,1])
pltlib.plot(mat[:,0])
pltlib.title('MATLAB Plot')
pltlib.xlabel('X-Axis')
pltlib.ylabel('Y-Axis')
pltlib.show()

個性化環境

在 MATLAB 中,個性化工作區的主要選項是更改搜尋路徑以包含自己喜歡的函式的位置。此類修改可以包含在一個啟動指令碼中,MATLAB 在啟動時將執行該指令碼。

Python 中的工具與 NumPy 中的工具相同。

定義“PYTHONPATH”環境變數以更改 Python 搜尋路徑,以便包含模組的位置。

在啟動互動式 Python 直譯器時,透過將“PYTHONSTARTUP”環境變數設定為該檔案的檔名來指定要執行的特定指令碼檔案。

與 MATLAB 形成對比的是,在 MATLAB 中,路徑上的任何內容都可以根據需要被呼叫,而在 Python 中,必須首先執行“匯入”行並在可訪問的特定檔案中建立函式。

結論

在本教程中,我們學習了 MATLAB 使用者如何切換到 Python,並討論了各種 MATLAB-Python 等價物。

更新於: 2023年1月9日

544 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告