SciPy個人學習筆記【持續更新】
來源:SciPy教程
目錄
SciPy子包
子包 | |
---|---|
scipy.cluster | 矢量量化/Kmeans |
scipy.constants | 物理和數學常數 |
scipy.fftpack | 傅里葉變換 |
scipy.integrate | 集成例程 |
scipy.interpolate | 插值 |
scipy.io | 數據輸入和輸出 |
scipy.linalg | 線性代數例程 |
scipy.ndimage | n維圖像包 |
scipy.odr | 正交距離迴歸 |
scipy.optimize | 優化 |
scipy.signal | 信號處理 |
scipy.sparse | 稀疏矩陣 |
scipy.spatial | 空間數據結構和算法 |
scipy.special | 任何特殊的數學函數 |
scipy.stats |
統計 |
SciPy常量
scipy.constants
包提供了各種常量。
數學常量
編號 | 常量 | 描述 |
---|---|---|
1 | pi |
PI值 |
2 | golden |
黃金比例 |
物理常量
編號 | 常量 | 描述 |
---|---|---|
1 | c |
真空中的光速 |
2 | speed_of_light |
真空中的光速 |
3 | h |
普朗克常數 |
4 | Planck |
普朗克常數h |
5 | G |
牛頓的引力常數 |
6 | e |
基本電荷 |
7 | R |
摩爾氣體常數 |
8 | Avogadro |
阿伏加德羅常數 |
9 | k |
波爾茲曼常數 |
10 | electron_mass 或者 m_e |
電子質量 |
顯然要記住所有常量十分困難,我們可以通過使用scipy.constants.find()
方法獲取指定鍵。
例如:
import scipy.constants
res = scipy.constants.physical_constants["alpha particle mass"]
print (res)
結果:
(6.64465723e-27, 'kg', 8.2e-35)
SciPy快速傅里葉變換
對時域信號計算傅里葉變換可用於信號和噪聲處理,圖像處理,音頻信號處理等領域。
SciPy提供fftpack
模塊,可讓用戶計算快速傅立葉變換。
一維離散傅里葉變換
from scipy.fftpack import fft
from scipy.fftpack import ifft
x = np.array([1.0, 2.0, 1.0, -1.0, 1.5])
y = fft(x) #應用傅里葉變換
yinv = ifft(y) #應用逆傅里葉變換
print (yinv)
執行結果
[ 1.0+0.j 2.0+0.j 1.0+0.j -1.0+0.j 1.5+0.j]
scipy.fftpack.fftfreq() #
生成採樣頻率
scipy.fftpack.fft()
#計算快速傅里葉變換。
離散餘弦變換
dct()離散餘弦變換:
from scipy.fftpack import dct
mydict = dct(np.array([4., 3., 5., 10., 5., 3.]))
print(mydict)
idct()逆離散餘弦變換:
from scipy.fftpack import dct
from scipy.fftpack import idct
d = idct(np.array([4., 3., 5., 10., 5., 3.]))
print(d)
SciPy積分
編號 | 示例 | 描述 |
---|---|---|
1 | quad |
單積分 |
2 | dblquad |
二重積分 |
3 | tplquad |
三重積分 |
4 | nquad |
n倍多重積分 |
5 | fixed_quad |
高斯積分,階數n |
6 | quadrature |
高斯正交到容差 |
7 | romberg |
Romberg積分 |
8 | trapz |
梯形規則 |
9 | cumtrapz |
梯形法則累計計算積分 |
10 | simps |
辛普森的規則 |
11 | romb |
Romberg積分 |
12 | polyint |
分析多項式積分(NumPy) |
13 | poly1d |
輔助函數polyint(NumPy) |
單積分
quad
的一般形式是scipy.integrate.quad(f,a,b)
,其中'f'
是要積分的函數的名稱。 而'a'
和'b'
分別是下限和上限。
例如:
import scipy.integrate
from numpy import exp
f= lambda x:exp(-x**2)
i = scipy.integrate.quad(f, 0, 1)
print (i)
返回結果
(0.7468241328124271, 8.291413475940725e-15)
其中第一個數字是積分值,第二個數值是積分值絕對誤差的估計值。
雙重積分
dblquad
的一般形式是scipy.integrate.dblquad(func,a,b,gfun,hfun)
。 其中,func
是要積分函數的名稱,'a'
和'b'
分別是x
變量的下限和上限,而gfun
和hfun
是定義變量y
的下限和上限的函數名稱。
例如:
即使g
和h
是常數,它們可能在很多情況下必須定義爲函數。
import scipy.integrate
from numpy import exp
from math import sqrt
f = lambda x, y : 16*x*y
g = lambda x : 0
h = lambda y : sqrt(1-4*y**2)
i = scipy.integrate.dblquad(f, 0, 0.5, g, h)
print (i)
SciPy插值
使用scipy.interpolate
包進行插值
例如:
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4)
print (x,y)
如上可得到兩個數組。
假設這兩個數組作爲空間點的兩個維度,使用下面的程序進行繪圖。
plt.plot(x, y,’o’)
plt.show()
一維插值
scipy.interpolate
中的interp1d
類是一種創建基於固定數據點的函數的便捷方法,可以使用線性插值在給定數據定義的域內的任意位置評估該函數。
f1 = interp1d(x, y,kind = 'linear') #線性
f2 = interp1d(x, y, kind = 'cubic') #立方
我們可以通過創建更多長度的新輸入查看插值的明顯區別。
xnew = np.linspace(0, 4,30)
plt.plot(x, y, 'o', xnew, f1(xnew), '-', xnew, f2(xnew), '--') # 三個不同類型分別顯示點,實線,虛線。
plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')
plt.show()
SciPy輸入和輸出
MATLAB
1 | loadmat |
加載一個MATLAB文件 |
2 | savemat |
保存爲一個MATLAB文件 |
3 | whosmat |
列出MATLAB文件中的變量 |
例如:
import scipy.io as sio
import numpy as np
#保存一個mat文件
vect = np.arange(10)
sio.savemat('array.mat', {'vect':vect})
#加載剛剛保存的mat文件
mat_file_content = sio.loadmat('array.mat')
print (mat_file_content)
如果想在不讀取數據到內存的情況下檢查MATLAB文件的內容 ,可利用whosmat命令。
import scipy.io as sio
mat_file_content = sio.whosmat(‘array.mat’)
print (mat_file_content)
SciPy線性代數
解線性方程組
#導入scipy和numpy包
import numpy as np
#聲明numpy數組
a = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]])
b = np.array([2, 4, -1])
#傳遞參數給求解函數
x = linalg.solve(a, b)
#打印結果
print (x)
查找行列式
在SciPy中可使用det()函數來求行列式
特徵值和特徵向量
scipy.linalg.eig
從普通或廣義特徵值問題計算特徵值。 該函數返回特徵值和特徵向量。
from scipy import linalg
import numpy as np
A = np.array([[1,2],[3,4]])
l, v = linalg.eig(A)
#輸出特徵值
print (l)
#輸出特徵向量
print (v)
奇異值分解
存在一個分解使得
其中U是m×m階酉矩陣;Σ是半正定m×n階對角矩陣;而V*,即V的共軛轉置,是n×n階酉矩陣。這樣的分解就稱作M的奇異值分解。Σ對角線上的元素Σi,其中Σi即爲M的奇異值。
用法:
from scipy import linalg
import numpy as np
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)
U, s, Vh = linalg.svd(a)
print (U, Vh, s)
SciPy Ndimage
ndimage
模塊專用於圖像處理。ndimage
表示一個n
維圖像。
首先顯示圖像:
from scipy import misc
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)使用包內自帶圖像
import matplotlib.pyplot as plt
plt.imshow(f)
plt.show()
裁剪圖象:
from scipy import misc
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)
lx, ly = face.shape
crop_face = face[int(lx/4): -int(lx/4), int(ly/4): -int(ly/4)]
import matplotlib.pyplot as plt
plt.imshow(crop_face)
plt.show()
倒置圖像:flipud()矩陣翻轉
from scipy import misc
face = misc.face()
flip_ud_face = np.flipud(face)
import matplotlib.pyplot as plt
plt.imshow(flip_ud_face)
plt.show()
旋轉圖像:rotate()
from scipy import misc,ndimage
face = misc.face()
rotate_face = ndimage.rotate(face, 45) #旋轉45度
import matplotlib.pyplot as plt
plt.imshow(rotate_face)
plt.show()
模糊圖像: sigma表示模糊程度
ndimage.gaussian_filter(face, sigma=3)
邊緣檢測
最常用的邊緣檢測算法包括 -
- 索貝爾(Sobel)
- 坎尼(Canny)
- 普魯伊特(Prewitt)
- 羅伯茨Roberts
- 模糊邏輯方法
ndimage
提供了一個叫Sobel
函數來檢測彩色塊的邊緣。 而NumPy提供了Hypot
函數來將兩個合成矩陣合併爲一個。