Python SciPy初学者教程介绍
计算是科学研究的重要组成部分。数学、工程、科学和其他技术问题很复杂,需要计算能力和速度。Python 提供了 SciPy 库,用于通过计算解决技术问题。
如何使用SciPy ?
本文介绍了 SciPy 教程以及如何通过示例在 Python 中实现代码。
先决条件
已安装 Python 2.7 或 Python 3
用于运行代码的 Python 环境。
已安装 SciPy 库。
已安装 NumPy 库(按照我们的指南:如何安装 NumPy)。
为绘图安装的 Matplotlib 库(可选)。
注: Python 2里不再有支持,2020年考虑切换到Python 3,按照我们的指南之一安装Python 3:如何在CentOS 7安装Python 3,如何在CentOS 8安装Python 3,如何安装Python 3 在 Ubuntu 上,如何在 Windows 上安装 Python。
什么是 SciPy?
SciPy (
Sci entific
Py thon) 是 Python 的开源科学计算模块。SciPy 基于 NumPy,包括解决科学问题的工具。科学家创建这个库是为了满足他们解决复杂问题日益增长的需求。
SciPy 与 NumPy
该NumPy的库(
民 erical
PY 马拉松)做数值计算。科学家使用这个库来处理数组,因为 NumPy 涵盖了数据科学、统计学和数学中的基本用途。
SciPy 涵盖高级计算和函数。该库添加了更多数据科学功能、所有线性代数函数和标准科学算法。
注意: Anaconda 默认包含 SciPy、NumPy 和 Matplotlib 库。看看我们上安装蟒蛇指南:如何在CentOS 7安装蟒蛇,如何在CentOS 8安装蟒蛇,如何在Ubuntu 18.04或20.04安装蟒蛇。
为什么要使用 SciPy?
SciPy 库建立在 NumPy 之上并在数组上运行。计算能力很快,因为 NumPy 使用 C 进行评估。
Python 科学堆栈类似于 MATLAB、Octave、Scilab 和 Fortran。主要区别在于 Python 易于学习和编写。
注意: 一些 Python 环境是科学的。如果你需要选择一个,请查看我们对最佳 Python IDE 和代码编辑器的比较。
SciPy 子包
如何使用SciPy?SciPy 库有不同的子包组。有两种方法可以从 SciPy 模块导入子包:
import scipy.<sub package name> as <alias>
或者:
from scipy import <sub package name> as <alias>
在这两种导入方法中,别名都是可选的。
SciPy 函数
SciPy 包括 NumPy 中可用的许多主要数组函数以及来自 SciPy 子包的一些常用模块。
要从子包导入函数,请使用:
from scipy.<subpackage> import <function>
注意: SciPy 中可用的一些 NumPy 函数显示弃用警告。
Python SciPy用法示例:基本功能
要获取任何 SciPy 函数的帮助和信息,请使用以下
help()
命令:
help(<name of function>)
该
help()
命令不需要参数。不带参数执行后,会出现提示输入函数名。
在 Python 中获得任何命令帮助的另一种快速方法是写下命令名称,在末尾加上一个问号,然后运行代码。
特殊功能
Python SciPy初学者教程:SciPy 模块中的特殊功能包括常用的计算和算法。所有特殊函数都接受 NumPy 数组作为输入。计算是按元素计算的。
要导入
special
子包,请使用:
import scipy.special as special
或者:
from scipy import special
要从
special
子包导入特定函数,请使用:
from scipy.special import <function name>
阶乘
通过运行计算任何数字的阶乘:
special.factorial(<integer or array>)
例如,要查找 10 的阶乘,请使用:
special.factorial(10)
排列组合
要查找排列数,请使用:
special.perm(<number of elements>, <number of elements taken>)
例如,要查看一次取两个的三个元素的排列数:
special.perm(6,2)
类似地,找到以下组合的数量:
special.comb(<number of elements>, <number of elements taken>, repetition=<True or False>)
要查找一次两个重复的三个元素的组合数,请输入:
special.comb(6,2, repetition=True)
排列和组合用于计算机科学排序算法。
Python SciPy初学者教程:指数函数
指数函数计算不同底数的指数。
计算以 10 为底的指数:
special.exp10(<integer or array>)
例如:
special.exp10([0,1,2])
计算机科学经常使用以二为底的指数函数:
special.exp2(<integer or array>)
计算以 2 为底的 10 次方:
special.exp2(10)
指数的对数和
指数对数和(LSE 或 LogSumExp)是机器学习算法使用的近似值。用以下公式计算 LSE:
special.logsumexp(<integer or array>)
贝塞尔函数
贝塞尔函数出现在波传播、信号处理和静态潜在问题中。找到第一类贝塞尔函数:
special.jn(<integer order>, <integer or array>)
利用完整的堆栈来可视化贝塞尔函数。要找到第一类的二阶贝塞尔函数,请使用:
#import stack
import scipy.special as special
import matplotlib.pyplot as plt
import numpy as np
#The X-axis
x = np.linspace(1,50,100)
#Bessel function of the first kind order two
jn1 = special.jn(2,x)
绘制结果:
#Plotting
plt.title('Bessel function first kind order two')
plt.plot(x, jn1)
积分和 ODE 函数
SciPy 提供了一个用于计算定积分的子包。要导入
integrate
子包,请使用:
import scipy.integrate as integrate
或者:
from scipy import integrate
integrate
使用以下命令从子包中导入特定函数:
from scipy.integrate import <function name>
一般集成
使用子包中的
quad
函数计算单变量积分
integrate
:
integrate.quad(<function>, <lower limit>, <upper limit>)
所述
function
输入是使用lambda函数定义。
例如,要计算函数 x+1 在 0 和 1 之间的定积分:
from scipy import integrate
f = lambda x: x+1
integrate.quad(f, 0, 1)
输出显示两个值。第一个值是评估的积分,第二个值是估计的误差。
优化功能
如何使用SciPy?SciPy 有一个优化子包,用于查找函数的最小值或最大值。该
optimize
子包包括用于查找局部和全局最优值的求解器和算法。
导入优化子包:
from scipy import optimize
或使用:
import scipy.optimize as optimize
要从子包导入特定函数
optimize
,请运行:
from scipy.optimize import <function name>
最小化函数
在机器学习中使用查找函数的最小值来降低算法的损失(或错误)。
例如,你可以创建一个函数并找到最小值。为此,请使用SciPy 中子包中的
fmin
函数
optimize
:
#Import stack
import numpy as np
from scipy import optimize
#Defining inverse sine function
def f(x):
return -np.sin(x)
#X-axis
x = np.linspace(0,5,100)
#Starting point
start = 3
#Simplex algorithm for optimization
optimized = optimize.fmin(f,start)
要绘制结果,请运行:
import matplotlib.pyplot as plt
plt.plot(x, f(x))
plt.scatter(start,f(start))
plt.scatter(optimized, f(optimized))
plt.legend(['Function -sin(x)', 'Starting point', 'Optimized minimum'])
傅立叶变换函数
SciPy 包含一个傅立叶变换函数的子包,称为
fftpack
. 这些变换是离散傅立叶变换 (DFT)。所有变换均使用快速傅立叶变换 (FFT) 算法进行应用。
要导入
fftpack
子包,请使用:
import scipy.fftpack as fftpack
或者:
from scipy import fftpack
Python SciPy用法示例 :
快速傅立叶变换
例如,创建一个周期函数作为三个正弦波的总和:
import numpy as np
freq_samp = 100
#Time
t = np.linspace(0, 1, freq_samp*2, endpoint = False )
#Frequencies
f1, f2, f3 = 1, 5, 20
#Amplitudes
A1, A2, A3 = 3, 2, 1
x1 = A1*np.sin(f1*2*np.pi*t)
x2 = A2*np.sin(f2*2*np.pi*t)
x3 = A3*np.sin(f3*2*np.pi*t)
#Sum of waves
x = x1+x2+x3
使用 绘制波浪
matplotlib
:
import matplotlib.pyplot as plt
plt.subplot(2,1,1)
plt.plot(t,x1,t,x2,t,x3)
plt.subplot(2,1,2)
plt.plot(t,x)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude');
接下来,应用
fft
和
fftfreq
函数
fftpack
对信号进行傅立叶变换。
from scipy import fftpack
A = fftpack.fft(x)
freq = fftpack.fftfreq(len(x))*freq_samp*2
绘制结果以查看频域:
plt.stem(freq,np.abs(A)/freq_samp,use_line_collection=True)
plt.xlim(-25,25)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.grid()
Python SciPy初学者教程:信号处理功能
该子包
signal
包括用于信号处理的函数。要导入
signal
,请运行:
import scipy.signal as signal
或者:
from scipy import signal
卷积
信号处理中的一个常见任务是卷积。SciPy 子包
signal
具有
convolve
执行此任务的功能。例如,创建两个不同频率的信号:
import numpy as np
#Time
t = np.linspace(0,1,100)
#Frequency
f1, f2 = 5, 2
#Two signals of different frequencies
first_signal = np.sin(f1*2*np.pi*t)
second_signal = np.sin(f2*2*np.pi*t)
绘制信号:
import matplotlib.pyplot as plt
#Plotting both signals
plt.subplot(2,1,1)
plt.plot(t, first_signal)
plt.subplot(2,1,2)
plt.plot(t, second_signal)
plt.ylabel('Amplitude')
plt.xlabel('Time (s)')
signal
从导入子包
scipy
。使用子包中的
convolve
函数
signal
对两个信号进行卷积:
#Importing the signal subpackage
from scipy import signal
#Convolving two signals
convolution = signal.convolve(first_signal, second_signal, mode='same')
绘制结果:
#Plotting the result
plt.plot(t, convolution)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
插值函数
如何使用SciPy?插值用于数值分析领域来概括两点之间的值。SciPy 具有
interpolate
带插值函数和算法的子包。
使用以下命令导入
interpolate
子包:
import scipy.interpolate as interpolate
或者:
from scipy import interpolate
Python SciPy用法示例 :
一维插值
SciPy
interpolate
子包具有
interp1d
数据的一维插值功能。例如,使用以下命令创建
玩具 数据
numpy
:
import numpy as np
#Create toy data
x = np.arange(0,10,0.5)
y = np.sin(x)
interp1d
从
interpolate
子包中插入数据:
from scipy import interpolate
#Interpolate
f = interpolate.interp1d(x, y)
#Create interpolation function
x_i = np.arange(0,10,3)
y_i = f(x_i)
绘制结果:
#Plot results
plt.scatter(x,y)
plt.plot(x_i, y_i)
plt.legend(['Interpolation', 'Data points'])
线性代数
SciPy 有一个功能齐全的线性代数子包。SciPy 线性代数子包使用 ATLAS LAPACK 和 BLAS 库进行了优化,以实现更快的计算。
要从 SciPy 导入线性代数包,请运行:
import scipy.linalg as linalg
或使用:
from scipy import linalg
所有线性代数函数都需要一个 NumPy 数组作为输入。
行列式
det
从
linalg
子包中计算矩阵的行列式:
linalg.det(<numpy array>)
例如:
import numpy as np
#Generate a 2D array
A = np.array([[1,2],[3, 4]])
from scipy import linalg
#Calculate the determinant
linalg.det(A)
逆矩阵
使用 确定逆矩阵
inv
:
linalg.inv(<numpy array>)
例如:
import numpy as np
#Generate a 2D array
A = np.array([[1,2],[3,4]])
from scipy import linalg
#Calculate the inverse matrix
linalg.inv(A)
特征向量和特征值
特征向量和特征值是一种矩阵分解方法。特征值-特征向量问题是一个普遍实现的线性代数问题。
该
eig
函数查找矩阵的特征值和特征向量:
linalg.eig(<numpy array>)
输出返回两个数组。第一个包含特征值,第二个包含给定矩阵的特征向量。例如:
import numpy as np
#Generate a 2D array
A = np.array([[1,2],[3, 4]])
from scipy import linalg
#Calculate the eigenvalues and eigenvectors
linalg.eig(A)
Python SciPy初学者教程:空间数据结构和算法
空间数据结构是由点、线和面组成的对象。SciPy 具有空间数据结构的算法,因为它们适用于许多科学学科。
使用以下命令
spatial
从 SciPy导入子包:
import scipy.spatial as spatial
或者:
from scipy import spatial
空间算法的一个显着例子是
Voronoi 图 。对于给定的一组点,Voronoi 地图将平面划分为多个区域。如果一个新点落入一个区域,则该区域中的点是最近的邻居。
注意: Voronoi 图与机器学习中的 k-最近邻算法有关。
例如,从 20 个随机点创建一个 Voronoi 图:
from scipy.spatial import Voronoi
import numpy as np
points = np.random.rand(20,2)
voronoi = Voronoi(points)
from scipy.spatial import voronoi_plot_2d
fig = voronoi_plot_2d(voronoi,show_vertices=False)
图像处理
SciPy 有一个用于各种 n 维图像处理的子包。要导入
ndimage
子包,请运行:
import scipy.ndimage as ndimage
或使用:
from scipy import ndimage
SciPy
misc
子包包含用于演示目的的示例图像。导入
misc
子包并显示图像:
from scipy import misc
from matplotlib import pyplot as plt
raccoon = misc.face()
#show image
plt.imshow(raccoon)
plt.show()
导入
ndimage
子包并将 a
uniform_filter
应用于图像。显示图像以查看结果:
from scipy import ndimage
filtered = ndimage.uniform_filter(raccoon)
plt.imshow(filtered)
文件IO(文件输入/输出包)
Python SciPy用法示例:SciPy 有一个名为
io
. 该
io
子包用于读取和写入来自不同科学计算程序和语言的数据格式,例如 Fortran、MATLAB、IDL 等。
使用以下命令
io
从 SciPy导入子包:
import scipy.io as sio
或使用:
from scipy import io as sio
Python SciPy初学者教程结论
如何使用SciPy?本教程提供了入门所需的 ScyPy 示例。Python 易于初学者学习,脚本易于编写和测试。将 SciPy 与其他 Python 库(例如 NumPy 和 Matplotlib)相结合,Python 将成为强大的科学工具。SciPy 子包有很好的文档记录并不断开发。