Python SciPy初学者教程和示例(如何使用SciPy())

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>)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
help()命令不需要参数。不带参数执行后,会出现提示输入函数名。
Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
在 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)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
排列组合要查找排列数,请使用:
special.perm(< number of elements>, < number of elements taken>)

例如,要查看一次取两个的三个元素的排列数:
special.perm(6,2)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
类似地,找到以下组合的数量:
special.comb(< number of elements>, < number of elements taken>, repetition=< True or False>)

要查找一次两个重复的三个元素的组合数,请输入:
special.comb(6,2, repetition=True)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
排列和组合用于计算机科学排序算法。Python SciPy初学者教程:指数函数指数函数计算不同底数的指数。计算以 10 为底的指数:
special.exp10(< integer or array>)

例如:
special.exp10([ 0,1,2])

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
计算机科学经常使用以二为底的指数函数:
special.exp2(< integer or array>)

计算以 2 为底的 10 次方:
special.exp2(10)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
指数的对数和指数对数和(LSE 或 LogSumExp)是机器学习算法使用的近似值。用以下公式计算 LSE:
special.logsumexp(< integer or array>)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
贝塞尔函数贝塞尔函数出现在波传播、信号处理和静态潜在问题中。找到第一类贝塞尔函数:
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)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
绘制结果:
#Plotting plt.title('Bessel function first kind order two') plt.plot(x, jn1)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
积分和 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)

输出显示两个值。第一个值是评估的积分,第二个值是估计的误差。
Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
优化功能
如何使用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)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
要绘制结果,请运行:
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'])

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
傅立叶变换函数
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

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
使用 绘制波浪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');

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
接下来,应用fftfftfreq函数fftpack对信号进行傅立叶变换。
from scipy import fftpack A = fftpack.fft(x) freq = fftpack.fftfreq(len(x))*freq_samp*2

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
绘制结果以查看频域:
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初学者教程和示例(如何使用SciPy())

文章图片
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)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
绘制信号:
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)')

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
signal从导入子包scipy。使用子包中的convolve函数signal对两个信号进行卷积:
#Importing the signal subpackage from scipy import signal #Convolving two signals convolution = signal.convolve(first_signal, second_signal, mode='same')

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
绘制结果:
#Plotting the result plt.plot(t, convolution) plt.xlabel('Time (s)') plt.ylabel('Amplitude')

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
插值函数
如何使用SciPy?插值用于数值分析领域来概括两点之间的值。SciPy 具有interpolate带插值函数和算法的子包。使用以下命令导入interpolate子包:
import scipy.interpolate as interpolate

或者:
from scipy import interpolate

Python SciPy用法示例:一维插值SciPyinterpolate子包具有interp1d数据的一维插值功能。例如,使用以下命令创建玩具数据numpy
import numpy as np #Create toy data x = np.arange(0,10,0.5) y = np.sin(x)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
interp1dinterpolate子包中插入数据:
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)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
绘制结果:
#Plot results plt.scatter(x,y) plt.plot(x_i, y_i) plt.legend([ 'Interpolation', 'Data points'])

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
线性代数SciPy 有一个功能齐全的线性代数子包。SciPy 线性代数子包使用 ATLAS LAPACK 和 BLAS 库进行了优化,以实现更快的计算。要从 SciPy 导入线性代数包,请运行:
import scipy.linalg as linalg

或使用:
from scipy import linalg

所有线性代数函数都需要一个 NumPy 数组作为输入。行列式
detlinalg子包中计算矩阵的行列式:
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)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
逆矩阵
使用 确定逆矩阵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)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
特征向量和特征值
特征向量和特征值是一种矩阵分解方法。特征值-特征向量问题是一个普遍实现的线性代数问题。该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())

文章图片
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)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
图像处理SciPy 有一个用于各种 n 维图像处理的子包。要导入ndimage子包,请运行:
import scipy.ndimage as ndimage

或使用:
from scipy import ndimage

SciPymisc子包包含用于演示目的的示例图像。导入misc子包并显示图像:
from scipy import misc from matplotlib import pyplot as plt raccoon = misc.face() #show image plt.imshow(raccoon) plt.show()

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
导入ndimage子包并将 auniform_filter应用于图像。显示图像以查看结果:
from scipy import ndimage filtered = ndimage.uniform_filter(raccoon) plt.imshow(filtered)

Python SciPy初学者教程和示例(如何使用SciPy())

文章图片
文件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 子包有很好的文档记录并不断开发。

    推荐阅读