SciPy個人學習筆記【持續更新】

SciPy個人學習筆記【持續更新】

來源:SciPy教程

目錄

SciPy子包

SciPy常量

 SciPy快速傅里葉變換

一維離散傅里葉變換

離散餘弦變換

 SciPy積分

單積分

雙重積分

SciPy插值 

一維插值

SciPy輸入和輸出

MATLAB

SciPy線性代數

解線性方程組

查找行列式

特徵值和特徵向量

奇異值分解 

SciPy Ndimage 

邊緣檢測 


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變量的下限和上限,而gfunhfun是定義變量y的下限和上限的函數名稱。

例如:

即使gh是常數,它們可能在很多情況下必須定義爲函數。

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函數來將兩個合成矩陣合併爲一個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章