Python SciPy教程

时间:2020-02-23 14:43:16  来源:igfitidea点击:

Python SciPy库是一组基于NumPy和数学算法的便捷功能。

Python SciPy

  • 目前,Python SciPy库支持集成,梯度优化,特殊功能,常微分方程求解器,并行编程工具等。
    换句话说,我们可以说,如果一般的数值计算教科书中有某些内容,您很有可能会在SciPy中找到它的实现。

  • 与SciPy进行的交互式会话基本上是一个数据处理和系统原型制作环境,就像MATLAB,Octave,Scilab或者R-lab。

  • SciPy是一个开源项目,根据BSD许可发布。

为什么选择SciPy?

SciPy提供了用于数据处理和数据可视化的高级命令和类,从而以显着的顺序增加了交互式Python会话的功能。

除了SciPy中的数学算法之外,Python程序员还可以使用从类,Web和数据库子例程到并行编程的所有内容,这使得开发复杂,专门的应用程序变得更加轻松快捷。

由于SciPy是开源的,因此世界各地的开发人员都可以为附加模块的开发做出贡献,这对于使用SciPy的科学应用非常有用。

安装SciPy库

在安装SciPy之前,我们将讨论SciPy的一些基本功能和重要功能。
我们可以简单地使用pip来安装SciPy软件包,在终端中运行以下命令(如果需要,可以添加sudo):

pip install scipy

要使用conda安装此软件包,请运行:

conda install -c anaconda scipy

导入Scipy库

要在我们的python项目中开始使用Scipy,我们只需将Scipy导入为:

import scipy

与Numpy互动

我们已经知道SciPy是基于NumPy构建的,因此对于所有基本需求,我们可以使用NumPy函数本身:

import numpy

SciPy还包含来自numpy和numpy.lib.scimath的函数,但建议直接使用它们,在这种情况下,请勿通过SciPy。

使用多项式

在SciPy中,有两种方法可以处理一维多项式。
第一个是使用" poly1d"类。
此类采用系数或者根进行初始化,并形成多项式对象。
当我们打印该对象时,我们将看到它打印为多项式。
让我们看一下示例代码:

from numpy import poly1d

# We'll use some functions from numpy remember!!
# Creating a simple polynomial object using coefficients
somePolynomial = poly1d([1,2,3])

# Printing the result
# Notice how easy it is to read the polynomial this way
print(somePolynomial)

# Let's perform some manipulations
print("\nSquaring the polynomial: \n")
print(somePolynomial* somePolynomial)

#How about integration, we just have to call a function
# We just have to pass a constant say 3
print("\nIntegrating the polynomial: \n")
print(somePolynomial.integ(k=3))

#We can also find derivatives in similar way
print("\nFinding derivative of the polynomial: \n")
print(somePolynomial.deriv())

# We can also solve the polynomial for some value, 
# let's try to solve it for 2
print("\nSolving the polynomial for 2: \n")
print(somePolynomial(2))

该程序在运行时会给出如下图所示的输出,我希望注释能使每段代码试图做什么变得清楚:

处理多项式的另一种方法是使用系数数组。
有一些函数可以对表示为序列的多项式执行运算,第一种方法看起来更易于使用,并且以可读的方式给出输出,因此对于该实例,我更喜欢第一个。

SciPy示例–线性代数

SciPy使用ATLAS LAPACK和BLAS库构建,具有非常快的线性代数功能。
如果您想提高速度,甚至可以使用这些库,但是在这种情况下,您必须深入研究。

SciPy中的所有线性代数例程都包含一个可以转换为2D数组的对象,并且输出的类型相同。

让我们借助示例来了解线性代数例程。
我们将尝试解决线性代数系统,可以使用scipy命令" linalg.solve"轻松完成。

该方法期望输入矩阵和右侧向量:

# Import required modules/libraries
import numpy as np
from scipy import linalg

# We are trying to solve a linear algebra system which can be given as:
#               1x + 2y =5
#               3x + 4y =6

# Create input array
A= np.array([[1,2],[3,4]])

# Solution Array
B= np.array([[5],[6]])

# Solve the linear algebra
X= linalg.solve(A,B)

# Print results
print(X)

# Checking Results
print("\n Checking results, following vector should be all zeros")
print(A.dot(X)-B)

科学整合

scipy的集成子包提供了各种集成技术。
我们只需输入以下内容即可查看这些内容:

help(integrate)

让我们尝试将lambda集成到脚本中:

# Import required packages
from scipy import integrate

# Using quad as we can see in list quad is used for simple integration
# arg1: A lambda function which returns x squared for every x
# We'll be integrating this function
# arg2: lower limit
# arg3: upper limit
result= integrate.quad(lambda x: x**2, 0,3)
print(result)

同样,我们添加了足够的注释,以使代码极为清晰。
现在运行此命令:

结果中的第二项可能是结果中的错误,我们现在可以忽略它。

科学傅立叶变换

傅里叶分析可帮助我们将函数表达为周期成分之和,并从这些成分中恢复信号。

让我们看一个简单的傅立叶变换示例。
我们将绘制两个罪孽的总和:

# Import Fast Fourier Transformation requirements
from scipy.fftpack import fft
import numpy as np

# Number of sample points
N = 600

# sample spacing
T = 1.0/800.0
x = np.linspace(0.0, N*T, N)
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
yf = fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N//2)

# matplotlib for plotting purposes
import matplotlib.pyplot as plt
plt.plot(xf, 2.0/N * np.abs(yf[0:N//2]))
plt.grid()
plt.show()

科学特殊功能

SciPy的特殊子软件包定义了许多数学物理学的功能。
可用的功能包括通风,贝塞尔,贝塔,椭圆,伽马,超几何,开尔文,马修,抛物柱面,球面波和曲面。
让我们看一下贝塞尔函数。

贝塞尔函数是带实阶或者复阶阿尔法的贝塞尔微分方程的一系列解决方案。

让我们借助一个示例更好地对其进行研究,该示例是一个固定在边缘的圆形鼓:

# Import special package
from scipy import special
import numpy as np
def drumhead_height(n, k, distance, angle, t):
  kth_zero = special.jn_zeros(n, k)[-1]
  return np.cos(t) * np.cos(n*angle) * special.jn(n, distance*kth_zero)
theta = np.r_[0:2*np.pi:50j]
radius = np.r_[0:1:50j]
x = np.array([r * np.cos(theta) for r in radius])
y = np.array([r * np.sin(theta) for r in radius])
z = np.array([drumhead_height(1, 1, r, theta, 0.5) for r in radius])

# Plot the results for visualization
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.jet)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

在现有功能NumPy和SciPy的帮助下,一些函数(如二进制熵函数,Heaviside阶跃函数和斜坡函数)可以直接实现,因此不包含在此软件包中。