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.ndimage
、scipy.signal
、scipy.spatial
,有沒有相關的功能。
先前也談過傅立葉轉換,NumPy 雖然有提供實作,不過 Scipy 提供更多的功能,在過去是由 scipy.fftpack
模組提供,不過 1.4 版以後被廢棄,改由 scipy.fft
模組提供,這些都是基於這系列文件下,在接觸 Scipy 時,可以用來認識其中各模組功能的方向。
附帶一提的是,過去版本中,scipy.misc
或 scipy.ndimage
有 imread
函式,可以用來讀取函式,現在已經被移除了,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()