Python SciPy初学者教程和示例:如何使用SciPy?

2021年11月20日16:49:44 发表评论 1,826 次浏览

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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: