4. Python--Scipy库(上/1-6)
本文非常全面的介紹了Scipy庫,希望大家有耐心的看下去。參考鏈接在最后。
目錄:
1. Scipy簡介
? ? 1.1 子包
? ? 1.2 數(shù)據(jù)結(jié)構(gòu)
2. Scipy開發(fā)環(huán)境安裝
? ? 2.1 Windows
? ? 2.2 Linux
3. Scipy基本功能
? ? 3.1 內(nèi)在Numpy數(shù)組創(chuàng)建
? ? 3.2 矩陣
4. Scipy簇聚
? ? 4.1 Scipy中實(shí)現(xiàn)K-Means
? ? 4.2 三個集群計(jì)算K均值
5. Scipy常量
? ? 5.1 Scipy常量包
? ? 5.2 可用常量列表
6. FFTpack
? ? 6.1 快速傅立葉變換
? ? 6.2 離散余弦變換
7. 積分
8. 插值
9. 輸入/輸出
10. Linalg
11. Ndimage
12. 優(yōu)化算法
13. 統(tǒng)計(jì)函數(shù)
14. CSGraph
15. Scipy空間
16. Scipy ODR
17. Scipy特殊包
------------------------------------------------------------------------------
1. Scipy簡介
SciPy,發(fā)音為Sigh Pi,是一個科學(xué)的python開源代碼,在BSD許可下分發(fā)的庫,用于執(zhí)行數(shù)學(xué),科學(xué)和工程計(jì)算。
SciPy庫依賴于NumPy,它提供了便捷且快速的N維數(shù)組操作。 SciPy庫的構(gòu)建與NumPy數(shù)組一起工作,并提供了許多用戶友好和高效的數(shù)字實(shí)踐,例如:數(shù)值積分和優(yōu)化的例程。 它們一起運(yùn)行在所有流行的操作系統(tǒng)上,安裝快速且免費(fèi)。 NumPy和SciPy易于使用,但強(qiáng)大到足以依靠世界上一些頂尖的科學(xué)家和工程師。
1.1?SciPy子包
SciPy被組織成覆蓋不同科學(xué)計(jì)算領(lǐng)域的子包。 這些總結(jié)在下表中 -
scipy.cluster? ?矢量量化/Kmeans(https://docs.scipy.org/doc/scipy/reference/cluster.html#module-scipy.cluster,,,,以下同此)
scipy.constants? ?物理和數(shù)學(xué)常數(shù)
scipy.fftpack? ?傅里葉變換
scipy.integrate? ?集成例程
scipy.interpolate? ?插值
scipy.io? ?數(shù)據(jù)輸入和輸出
scipy.linalg? ?線性代數(shù)例程
scipy.ndimagen? ?維圖像包
scipy.odr? ?正交距離回歸
scipy.optimize? ?優(yōu)化
scipy.signal? ?信號處理
scipy.sparse? ?稀疏矩陣
scipy.spatial? ?空間數(shù)據(jù)結(jié)構(gòu)和算法
scipy.special? ?任何特殊的數(shù)學(xué)函數(shù)
scipy.stats? ?統(tǒng)計(jì)
?
1.2?數(shù)據(jù)結(jié)構(gòu)
SciPy使用的基本數(shù)據(jù)結(jié)構(gòu)是由NumPy模塊提供的多維數(shù)組。 NumPy為線性代數(shù),傅立葉變換和隨機(jī)數(shù)生成提供了一些功能,但與SciPy中等效函數(shù)的一般性不同。
?
2. Scipy開發(fā)環(huán)境安裝
標(biāo)準(zhǔn)Python發(fā)行版不捆綁任何SciPy模塊。 一個輕量級的選擇是使用流行的Python包安裝程序安裝SciPy,
$ pip install pandas
如果安裝Anaconda Python軟件包,默認(rèn)情況下會安裝Pandas。 以下是將它們安裝在不同操作系統(tǒng)中的軟件包和鏈接。
2.1?Windows
Anaconda(來自https://www.continuum.io)是SciPy堆棧的免費(fèi)Python發(fā)行版。 它也適用于Linux和Mac。有關(guān)安裝的教程請參考:https://www.yiibai.com/pandas/python_pandas_environment_setup.html
Canopy(https://www.enthought.com/products/canopy/)免費(fèi)提供,以及用于Windows,Linux和Mac的完整SciPy堆棧的商業(yè)發(fā)行。
Python(x,y)- 這是一個免費(fèi)的Python發(fā)行版,其中包含用于Windows操作系統(tǒng)的SciPy堆棧和Spyder IDE。 (可從https://python-xy.github.io/下載)
?
2.2 Linux
各個Linux發(fā)行版的軟件包管理器用于在SciPy堆棧中安裝一個或多個軟件包。
Ubuntu
可以使用以下路徑在Ubuntu中安裝Python。
$ sudo apt-get install python-numpy python-scipy
python-matplotlibipythonipython-notebook python-pandas python-sympy python-nose
Shell
Fedora
可以使用以下路徑在Fedora中安裝Python。
sudo yum install numpyscipy python-matplotlibipython python-pandas
sympy python-nose atlas-devel
?
3.?Scipy基本功能
默認(rèn)情況下,所有的NumPy函數(shù)都可以通過SciPy命名空間獲得。 當(dāng)導(dǎo)入SciPy時,不需要顯式導(dǎo)入NumPy函數(shù)。 NumPy的主要目標(biāo)是均勻多維數(shù)組。 它是一個元素表(通常是數(shù)字),都是相同類型,由正整數(shù)的元組索引。 在NumPy中,大小(尺寸)被稱為軸。 軸的數(shù)量稱為等級。
現(xiàn)在,讓修改NumPy中的Vectors和Matrices的基本功能。 由于SciPy構(gòu)建在NumPy數(shù)組之上,因此需要了解NumPy基礎(chǔ)知識。 由于線性代數(shù)的大多數(shù)部分只處理矩陣。
NumPy向量
向量(Vector)可以通過多種方式創(chuàng)建。 其中一些描述如下。
將Python數(shù)組類對象轉(zhuǎn)換為NumPy中的數(shù)組,看看下面的例子。
import numpy as np
list=[1,2,3,4]
arr=np.array(list)
print(arr)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[1 2 3 4]
?
3.1?內(nèi)在NumPy數(shù)組創(chuàng)建
NumPy有從頭開始創(chuàng)建數(shù)組的內(nèi)置函數(shù)。 其中一些函數(shù)解釋如下。
使用zeros()
zeros(shape)函數(shù)將創(chuàng)建一個用指定形狀(shape)填充0值的數(shù)組。 默認(rèn)dtype是float64。 看看下面的例子。
import numpy as np
print(np.zeros((2,3)))
執(zhí)行上面示例代碼,得到以下結(jié)果 -
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
?
使用ones()
ones(shape)函數(shù)將創(chuàng)建一個填充1值的數(shù)組。 它在所有其他方面與0相同。 看看下面的例子。
import numpy as np
print(np.ones((2,3)))
執(zhí)行上面示例代碼,得到以下結(jié)果 -
array([[ 1., 1., 1.],
[ 1., 1., 1.]])
使用arange()
arange()函數(shù)將創(chuàng)建具有有規(guī)律遞增值的數(shù)組。 看看下面的例子。
import numpy as np
print(np.arange(7))
執(zhí)行上面示例代碼,得到以下結(jié)果 -
array([0, 1, 2, 3, 4, 5, 6])
?
定義值的數(shù)據(jù)類型
看看下面一段示例代碼 -
import numpy as np
arr=np.arange(2,10,dtype=np.float)
print(arr)
print("Array Data Type :",arr.dtype)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 2. 3. 4. 5. 6. 7. 8. 9.]
Array Data Type : float64
?
使用linspace()
linspace()函數(shù)將創(chuàng)建具有指定數(shù)量元素的數(shù)組,這些元素將在指定的開始值和結(jié)束值之間平均間隔。 看看下面的例子。
import numpy as np
print(np.linspace(1.,4.,6))
執(zhí)行上面示例代碼,得到以下結(jié)果 -
array([ 1. , 1.6, 2.2, 2.8, 3.4, 4. ])
?
3.2?矩陣
矩陣是一個專門的二維數(shù)組,通過操作保留其2-D特性。 它有一些特殊的運(yùn)算符,如*(矩陣乘法)和**(矩陣冪值)。 看看下面的例子。
import numpy as np
print(np.matrix('1 2; 3 4'))
執(zhí)行上面示例代碼,得到以下結(jié)果 -
matrix([[1, 2],
[3, 4]])
矩陣的共軛轉(zhuǎn)置
此功能返回自我的(復(fù)數(shù))共軛轉(zhuǎn)置。 看看下面的例子。
import numpy as np
mat=np.matrix('1 2; 3 4')
print(mat.H)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
matrix([[1, 3],
? ? ? ? [2, 4]])
?
矩陣的轉(zhuǎn)置
此功能返回自身的轉(zhuǎn)置。看看下面的例子。
import numpy as np
mat=np.matrix('1 2; 3 4')
print(mat.T)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
matrix([[1, 3],
? ? ? ? [2, 4]])
?
當(dāng)轉(zhuǎn)置一個矩陣時,我們創(chuàng)建一個新的矩陣,其行是原始的列。 另一方面,共軛轉(zhuǎn)置為每個矩陣元素交換行和列索引。 矩陣的逆矩陣是一個矩陣,如果與原始矩陣相乘,則產(chǎn)生一個單位矩陣。
?
4.?Scipy簇聚
K均值聚類是一種在一組未標(biāo)記數(shù)據(jù)中查找聚類和聚類中心的方法。 直覺上,我們可以將一個群集(簇聚)看作 - 包含一組數(shù)據(jù)點(diǎn),其點(diǎn)間距離與群集外點(diǎn)的距離相比較小。 給定一個K中心的初始集合,K均值算法重復(fù)以下兩個步驟 -
對于每個中心,比其他中心更接近它的訓(xùn)練點(diǎn)的子集(其聚類)被識別出來。
計(jì)算每個聚類中數(shù)據(jù)點(diǎn)的每個要素的平均值,并且此平均向量將成為該聚類的新中心。
重復(fù)這兩個步驟,直到中心不再移動或分配不再改變。 然后,可以將新點(diǎn)x分配給最接近的原型的群集。 SciPy庫通過集群包提供了K-Means算法的良好實(shí)現(xiàn)。 下面來了解如何使用它。
4.1?SciPy中實(shí)現(xiàn)K-Means
我們來看看并理解如何在SciPy中實(shí)現(xiàn)K-Means。
導(dǎo)入K-Means
下面來看看每個導(dǎo)入的函數(shù)的實(shí)現(xiàn)和用法。
from SciPy.cluster.vq import kmeans,vq,whiten
?
數(shù)據(jù)生成
我們需要生成(模擬)一些數(shù)據(jù)來探索聚類。參考以下代碼 -
from numpy import vstack,array
from numpy.random impor trand
# data generation with three features?
data=vstack((rand(100,3)+array([.5,.5,.5]),rand(100,3)))
現(xiàn)在,我們來看看生成的模擬數(shù)據(jù),上述程序?qū)⑸梢韵螺敵觥?/p>
[[ 1.34103331? 1.13924682? 0.68465819]
[ 1.28481332? 0.91318917? 0.84225546]
[ 0.96498008? 1.42382266? 0.83564809]
[ 1.37049373? 0.66635033? 1.46568707]
[ 0.87424166? 0.86090225? 1.22545336]
[ 1.0264795? 0.90724604? 1.46837972]
[ 1.40996857? 1.37769991? 1.39805802]
[ 0.964556? ? 0.71632157? 1.47983347]
[ 0.69909637? 1.21695335? 1.46434369]
[ 1.01887602? 0.86448455? 1.02242951]
[ 0.82573176? 1.19165063? 1.09085707]
[ 0.64378227? 0.70673944? 0.69484097]
[ 1.16087103? 0.64371977? 0.89720984]
[ 1.23410673? 0.56805382? 1.33534058]
[ 0.50417695? 1.29632466? 0.96589447]
[ 0.91395183? 1.39173555? 1.0748435 ]
[ 1.04540644? 1.20721464? 0.97173727]
... ...
[ 0.79250839? 0.48689797? 0.42250824]
[ 0.05846914? 0.83469742? 0.57586067]
[ 0.0308333? 0.8642561? 0.1111777 ]
[ 0.61327069? 0.43425013? 0.99716439]
[ 0.81698148? 0.91098877? 0.12706862]
[ 0.60665992? 0.55999208? 0.57454962]
[ 0.13894142? 0.03315365? 0.43182983]
[ 0.62293781? 0.34701877? 0.61229591]]
根據(jù)每個要素標(biāo)準(zhǔn)化一組觀察值。 在運(yùn)行K-Means之前,使用白化重新縮放觀察集的每個特征維度是有好處的。 每個特征除以所有觀測值的標(biāo)準(zhǔn)偏差以給出其單位差異。
美化數(shù)據(jù)
我們可使用以下代碼來美白數(shù)據(jù)。
# whitening of data
data=whiten(data)
print(data)
?
4.2?用三個集群計(jì)算K均值
現(xiàn)在使用以下代碼計(jì)算三個群集的K均值。
# computing K-Means with K = 3 (2 clusters)
centroids,_=kmeans(data,3)
上述代碼對形成K個簇的一組觀測向量執(zhí)行K均值。 K-Means算法調(diào)整質(zhì)心直到不能獲得足夠的進(jìn)展,即失真的變化,因?yàn)樽詈笠淮蔚∮谀硞€閾值。 在這里,可以通過使用下面給出的代碼打印centroids變量來觀察簇。
print(centroids)
上面的代碼將生成以下輸出。
print(centroids)[[2.260347021.439243351.3697022][2.637885722.814464622.85163854][0.735072561.308018551.44477558]]
使用下面給出的代碼將每個值分配給一個集群。
# assign each sample to a cluster
clx,_=vq(data,centroids)
vq函數(shù)將'M'中的每個觀察向量與'N'obs數(shù)組與centroids進(jìn)行比較,并將觀察值分配給最近的聚類。 它返回每個觀察和失真的聚類。 我們也可以檢查失真。使用下面的代碼檢查每個觀察的聚類。
# check clusters of observation
print(clx)
上面的代碼將生成以下輸出。
array([1,1,0,1,1,1,0,1,0,0,1,1,1,0,0,1,1,0,0,1,0,2,0,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,1,0,1,0,0,0,1,1,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,2,1,2,2,2,2,2,2,2,2,0,2,0,2,2,2,2,2,0,0,2,2,2,1,0,2,0,2,2,2,2,2,2,2,2,2,0,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,0,2,0,2,2,2,2,2,2,2,2,2,0,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],dtype=int32)
Python
上述數(shù)組的不同值 0,1,2表示簇。
?
5.?Scipy常量
SciPy常量(constant)包提供了廣泛的常量,用于一般科學(xué)領(lǐng)域。
5.1?SciPy常量包
scipy.constants包提供了各種常量。必須導(dǎo)入所需的常量并根據(jù)需要來使用它們。下面看看這些常量變量是如何導(dǎo)入和使用的。
首先,通過下面的例子來比較'pi'值。
#Import pi constant from both the packages
import scipy
import math
print("sciPy - pi = %.16f"%scipy.constants.pi)
print("math - pi = %.16f"%math.pi)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
sciPy - pi = 3.1415926535897931
math - pi = 3.1415926535897931
?
5.2?可用的常量列表
下表簡要介紹了各種常數(shù)(常量)。
數(shù)學(xué)常量
物理常量
下表列出了最常用的物理常量。
單位
下表列出了SI單位。
這些單位范圍從yotta,zetta,exa,peta,tera ...... kilo,hector,... nano,pico,...到zepto。
其他重要常量
下表列出了SciPy中使用的其他重要常量。
要記住所有這些都有點(diǎn)困難。可使用scipy.constants.find()方法獲取指定鍵的簡單方法。 看看下面的例子。
import scipy.constants
res=scipy.constants.physical_constants["alpha particle mass"]
print(res)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
(6.64465723e-27, 'kg', 8.2e-35)
?
6. Scipy FFTpack
對時域信號計(jì)算傅里葉變換以檢查其在頻域中的行為。 傅里葉變換可用于信號和噪聲處理,圖像處理,音頻信號處理等領(lǐng)域。SciPy提供fftpack模塊,可讓用戶計(jì)算快速傅立葉變換。
以下是一個正弦函數(shù)的例子,它將用于使用fftpack模塊計(jì)算傅里葉變換。
6.1?快速傅立葉變換
下面來了解一下快速傅立葉變換的細(xì)節(jié)。
一維離散傅立葉變換
長度為N的序列x [n]的FFT y [k]由fft()計(jì)算,逆變換使用ifft()計(jì)算。 看看下面的例子
#Importing the fft and inverse fft functions from fftpackage
from scipy.fftpack import fft
?
#create an array with random n numbers
x=np.array([1.0,2.0,1.0,-1.0,1.5])
?
#Applying the fft function
y=fft(x)
print(y)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 4.50000000+0.j? ? ? ? ? 2.08155948-1.65109876j? -1.83155948+1.60822041j
-1.83155948-1.60822041j? 2.08155948+1.65109876j]
?
再看另一個示例 -
#Importing the fft and inverse fft functions from fftpackage from scipy.fftpack import fft
from scipy.fftpack import ifft
#create an array with random n numbers
x=np.array([1.0,2.0,1.0,-1.0,1.5])
#Applying the fft function
y=fft(x)
#FFT is already in the workspace, using the same workspace to for inverse transform
yinv=ifft(y)
print(yinv)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 1.0+0.j? 2.0+0.j? 1.0+0.j -1.0+0.j? 1.5+0.j]
?
scipy.fftpack模塊允許計(jì)算快速傅立葉變換。 作為一個例子,一個(嘈雜的)輸入信號可能看起來如下 -
import numpy as np?
time_step=0.02
period=5
time_vec=np.arange(0,20,time_step)
sig=np.sin(2*np.pi/period*time_vec)+0.5*np.random.randn(time_vec.size)
print(sig.size)
我們正以0.02秒的時間步長創(chuàng)建一個信號。 最后一條語句顯示信號sig的大小。 輸出結(jié)果如下 -
1000
?
我們不知道信號頻率; 只知道信號sig的采樣時間步長。 信號應(yīng)該來自實(shí)際函數(shù),所以傅里葉變換將是對稱的。scipy.fftpack.fftfreq()函數(shù)將生成采樣頻率,scipy.fftpack.fft()將計(jì)算快速傅里葉變換。
下面通過一個例子來理解這一點(diǎn)。
from scipy import fftpack
sample_freq=fftpack.fftfreq(sig.size,d=time_step)
sig_fft=fftpack.fft(sig)
print(sig_fft)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
array([
? 25.45122234 +0.00000000e+00j,? 6.29800973 +2.20269471e+00j,
? 11.52137858 -2.00515732e+01j,? 1.08111300 +1.35488579e+01j,
? …….])
?
6.2?離散余弦變換
離散余弦變換(DCT)根據(jù)以不同頻率振蕩的余弦函數(shù)的和表示有限數(shù)據(jù)點(diǎn)序列。 SciPy提供了一個帶有函數(shù)idct的DCT和一個帶有函數(shù)idct的相應(yīng)IDCT。看看下面的一個例子。
from scipy.fftpack import dct
mydict=dct(np.array([4.,3.,5.,10.,5.,3.]))
print(mydict)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 60.? ? ? ? ? -3.48476592? ?-13.85640646? ? 11.3137085? ? 6.? ? ? ? ? -6.31319305]
?
逆離散余弦變換從其離散余弦變換(DCT)系數(shù)重建序列。idct函數(shù)是dct函數(shù)的反函數(shù)。 可通過下面的例子來理解這一點(diǎn)。
from scipy.fftpack import dct?
from scipy.fftpack importi dct
d=idct(np.array([4.,3.,5.,10.,5.,3.]))
print(d)
執(zhí)行上面示例代碼,得到以下結(jié)果 -
[ 39.15085889 -20.14213562? -6.45392043? 7.13341236? 8.14213562
?
參考:https://docs.python.org/3/
https://www.yiibai.com/scipy/scipy_introduction.html
總結(jié)
以上是生活随笔為你收集整理的4. Python--Scipy库(上/1-6)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线性同余法[纯理论]
- 下一篇: 22.基于深度学习的车型识别方法及系统实