
矩陣與向量計算
|
119
把 numpy 應用到擴散問題
利用學到的
numpy
知識,可以輕易地將我們的純 Python 程式碼改寫成向量化的計算,唯
一必須介紹的新功能就是
numpy
的
roll
函式,這個函式的功能等同於我們對索引取模數
(modulo)的技巧,但是,它針對整個
numpy
陣列做這件事。本質上,它以向量化的方
式重新索引︰
>>> import numpy as np
>>> np.roll([1,2,3,4], 1)
array([4, 1, 2, 3])
>>> np.roll([[1,2,3],[4,5,6]], 1, axis=1)
array([[3, 1, 2],
[6, 4, 5]])
roll
函式建立新的
numpy
陣列,有優點,也有缺點。缺點是我們要花時間配置新空間,
接著必須填上適當的資料。另一方面,一旦建立新陣列,我們就能夠相當快速地對它進
行向量化操作,而且不必承受快取未命中的痛苦,這將大幅提升我們的格點計算速度。
稍後在本章中,我們會重寫這段程式碼,好讓我們不必持續配置更多的記憶體就能夠得
到相同的好處。
藉由這個額外的函式,我們可以使用較簡單且向量化的
numpy
陣列來重寫範例 6-6 的
Python 擴散程式碼。另外,我們將微分的計算(
grid_xx
與
grid_yy
)拆解成獨立的函
式。範例 6-9 顯示初步的
numpy
擴散程式碼。
範例
6-9
初步的
numpy
擴散
import numpy as np
grid_shape = (1024, 1024)
def laplacian(grid): ...