簡介 Scipy


Scipy 基於 NumPy,就過去的 Scipy 版本來說,以 numpy 為名稱空間的函式,都可以透過 scipy 名稱空間來取得,例如,numpy.arange,可以透過 scipy.arange

不過,從 Scipy 1.4 開始,透過 scipy 來公開 numpy 的函式的作法被廢棄了,例如,撰寫這篇文件,使用的 Scipy 版本是 1.6,如果你試圖這麼使用:

>>> import scipy
>>> scipy.arange(0, 10)
<stdin>:1: DeprecationWarning: scipy.arange is deprecated and will be removed in SciPy 2.0.0, use numpy.arange instead
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>>

可以看到出現了 DeprecationWarning,其中也說明了,SciPy 2.0.0 以後就會將之移除,也就是說,若 NumPy 本來就有的函式,就直接透過 numpy 來取得。

不過,從 Scipy 曾打算透過 scipy 來公開 numpy 上的函式可以得知,Scipy 本來是打算封裝 NumPy,除了 NumPy 既有的功能之外,還提供了許多科學運算的實作。

例如,NumPy 的 Constants 提供的是基本的數學常數,然而 Scipy 的 Constants 提供更多物理、化學等會用到的常數。

類似地,numpy.linalg 提供基本的線性代數實作,而 scipy.linalg 提供更多與線代相關的科學運算。

Scipy 提供的模組可以在〈SciPy Tutorial〉略知一二,然而,畢竟科學有著各式各樣的領域,各式各樣的數學與公式,全面地認識 Scipy 各個模組的意義不大。

最好的方式是,先對 NumPy 有一定的認識與使用,在需要基於 NumPy 實作其本身沒有提供的功能或運算時,試著搜尋 Scipy 是否已經有相關或類似的實作。

例如,這一系列的文件,談到了如何處理影像、訊號,也談到了一些空間幾何處理,有些是透過 OpenCV 的功能,有些是透過 Matplotlib 來實現;現在若假設你只懂 NumPy,下一步想試著用 Scipy 來實現,那麼可以試著看看 scipy.ndimagescipy.signalscipy.spatial,有沒有相關的功能。

先前也談過傅立葉轉換,NumPy 雖然有提供實作,不過 Scipy 提供更多的功能,在過去是由 scipy.fftpack 模組提供,不過 1.4 版以後被廢棄,改由 scipy.fft 模組提供,這些都是基於這系列文件下,在接觸 Scipy 時,可以用來認識其中各模組功能的方向。

附帶一提的是,過去版本中,scipy.miscscipy.ndimageimread 函式,可以用來讀取函式,現在已經被移除了,Scipy 官方文件是建議使用 imageio

既然談到了 scipy.misc,這模組就只剩幾個函式,其中有個 face 函式,是隻公有領域(public domain)的彩色狸臉照片,尺寸為 1024 * 768,可以透過 gray 參數設為 True 轉為灰階;這系列在處理影像時,都使用我的吉祥物,如果你寫範例時懶得找圖片,也可以用這隻狸的照片:

from scipy import misc
import matplotlib.pyplot as plt

face = misc.face()

plt.gray()
plt.imshow(face)
plt.show()

簡介 Scipy