SciPy是一个基于Python的开源库,可用于数学,科学计算,工程和技术计算。
SciPy也发音为“ Sigh Pi”。
SciPy的子软件包:
SciPy包含各种子软件包,可帮助解决与科学计算有关的最常见问题。
SciPy是最常用的科学库,仅次于C / C ++或Matlab的GNU科学库。
易于使用和理解,以及快速的计算能力。
它可以对NumPy库的数组进行操作。
Numpy:
SciPy:
您可以通过pip在Windows中安装SciPy
Python3 -m pip install --user numpy scipy
在Linux上安装Scipy
sudo apt-get install python-scipy python-numpy
在Mac中安装SciPy
sudo port install py35-scipy py35-numpy
在开始学习SciPy之前,您需要了解基本功能以及不同类型的NumPy数组
导入infSciPy模块和Numpy的标准方法:
from scipy import special #same for other modules
import numpy as np
Scipy I / O软件包具有广泛的功能,可以处理不同的文件格式,例如Matlab,Arff,Wave,Matrix Market,IDL,NetCDF,TXT,CSV和二进制格式。
让我们以一个经常使用MatLab的文件格式示例为例:
import numpy as np
from scipy import io as sio
array = np.ones((4, 4))
sio.savemat('example.mat', {'ar': array})
data = sio.loadmat(‘example.mat', struct_as_record=True)
data['ar']
Output:
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
代码说明
help(scipy.special)
Output :
NAME
scipy.special
DESCRIPTION
========================================
Special functions (:mod:`scipy.special`)
========================================
.. module:: scipy.special
Nearly all of the functions below are universal functions and follow
broadcasting and automatic array-looping rules. Exceptions are noted.
Cubic Root Function:
立方根函数可找到值的立方根。
Syntax:
scipy.special.cbrt(x)
Example:
from scipy.special import cbrt
#Find cubic root of 27 & 64 using cbrt() function
cb = cbrt([27, 64])
#print value of cb
print(cb)
Output: array([3., 4.])
Exponential Function:
指数函数按元素计算10 ** x。
Example:
from scipy.special import exp10
#define exp10 function and pass value in its
exp = exp10([1,10])
print(exp)
Output: [1.e+01 1.e+10]
Permutations & Combinations:
SciPy还提供了计算排列和组合的功能。
Combinations – scipy.special.comb(N,k)
组合
Example:
from scipy.special import comb
#find combinations of 5, 2 values using comb(N, k)
com = comb(5, 2, exact = False, repetition=True)
print(com)
Output: 15.0
Permutations –
排列
scipy.special.perm(N,k)
Example:
from scipy.special import perm
#find permutation of 5, 2 using perm (N, k) function
per = perm(5, 2, exact = True)
print(per)
Output: 20
Log Sum Exponential Function
对数和指数计算对数和指数输入元素的对数。
Syntax :
scipy.special.logsumexp(x)
Bessel Function
第n个整数阶计算功能
Syntax :
scipy.special.jn()
Linear Algebra with SciPy(具有SciPy的线性代数)
SciPy的线性代数是BLAS和ATLAS LAPACK库的实现。
与BLAS和LAPACK相比,线性代数的性能非常快。
线性代数例程接受二维数组对象,并且输出也是二维数组。
现在让我们用scipy.linalg做一些测试,
计算二维矩阵的行列式
from scipy import linalg
import numpy as np
#define square matrix
two_d_array = np.array([ [4,5], [3,2] ])
#pass values to det() function
linalg.det( two_d_array )
Output: -7.0
Inverse Matrix –
scipy.linalg.inv()
Scipy的逆矩阵可计算任何方阵的逆。
Let’s see,
from scipy import linalg
import numpy as np
# define square matrix
two_d_array = np.array([ [4,5], [3,2] ])
#pass value to function inv()
linalg.inv( two_d_array )
Output:
array( [[-0.28571429, 0.71428571],
[ 0.42857143, -0.57142857]] )
Eigenvalues and Eigenvector – scipy.linalg.eig()
Example,
from scipy import linalg
import numpy as np
#define two dimensional array
arr = np.array([[5,4],[6,3]])
#pass value into function
eg_val, eg_vect = linalg.eig(arr)
#get eigenvalues
print(eg_val)
#get eigenvectors
print(eg_vect)
Output:
[ 9.+0.j -1.+0.j] #eigenvalues
[ [ 0.70710678 -0.5547002 ] #eigenvectors
[ 0.70710678 0.83205029] ]
示例:挥手并使用Matplotlib库进行演示。 我们以sin(20×2πt)的简单周期函数为例
%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
#Frequency in terms of Hertz
fre = 5
#Sample rate
fre_samp = 50
t = np.linspace(0, 2, 2 * fre_samp, endpoint = False )
a = np.sin(fre * 2 * np.pi * t)
figure, axis = plt.subplots()
axis.plot(t, a)
axis.set_xlabel ('Time (s)')
axis.set_ylabel ('Signal amplitude')
plt.show()
Output :
你可以看到这个。 频率为5 Hz,其信号在1/5秒内重复一次–在特定的时间段内被称为。
现在,让我们借助DFT应用程序使用此正弦波。
from scipy import fftpack
A = fftpack.fft(a)
frequency = fftpack.fftfreq(len(a)) * fre_samp
figure, axis = plt.subplots()
axis.stem(frequency, np.abs(A))
axis.set_xlabel('Frequency in Hz')
axis.set_ylabel('Frequency Spectrum Magnitude')
axis.set_xlim(-fre_samp / 2, fre_samp/ 2)
axis.set_ylim(-5, 110)
plt.show()
Output:
%matplotlib inline
import matplotlib.pyplot as plt
from scipy import optimize
import numpy as np
def function(a):
return a*2 + 20 * np.sin(a)
plt.plot(a, function(a))
plt.show()
#use BFGS algorithm for optimization
optimize.fmin_bfgs(function, 0)
Output:
Optimization terminated successfully.
Current function value: -23.241676
Iterations: 4
Function evaluations: 18
Gradient evaluations: 6
array([-1.67096375])
optimize.basinhopping(function, 0)
Output:
fun: -23.241676238045315
lowest_optimization_result:
fun: -23.241676238045315
hess_inv: array([[0.05023331]])
jac: array([4.76837158e-07])
message: 'Optimization terminated successfully.'
nfev: 15
nit: 3
njev: 5
status: 0
success: True
x: array([-1.67096375])
message: ['requested number of basinhopping iterations completed successfully']
minimization_failures: 0
nfev: 1530
nit: 100
njev: 510
x: array([-1.67096375])
import numpy as np
from scipy.optimize import minimize
#define function f(x)
def f(x):
return .4*(1 - x[0])**2
optimize.minimize(f, [2, -1], method="Nelder-Mead")
Output:
final_simplex: (array([[ 1. , -1.27109375],
[ 1. , -1.27118835],
[ 1. , -1.27113762]]), array([0., 0., 0.]))
fun: 0.0
message: 'Optimization terminated successfully.'
nfev: 147
nit: 69
status: 0
success: True
x: array([ 1. , -1.27109375])
示例:让我们以图像的几何变换示例为例
from scipy import misc
from matplotlib import pyplot as plt
import numpy as np
#get face image of panda from misc package
panda = misc.face()
#plot or show image of face
plt.imshow( panda )
plt.show()
Output:
现在我们向下翻转当前图像:
#Flip Down using scipy misc.face image
flip_down = np.flipud(misc.face())
plt.imshow(flip_down)
plt.show()
Output:
示例:使用Scipy旋转图像,
from scipy import ndimage, misc
from matplotlib import pyplot as plt
panda = misc.face()
#rotatation function of scipy for image – image rotated 135 degree
panda_rotate = ndimage.rotate(panda, 135)
plt.imshow(panda_rotate)
plt.show()
Output:
与Scipy集成–数值积分
当我们集成不可能进行分析积分的任何函数时,我们需要转向数值积分
SciPy提供了将函数与数值积分相集成的功能。
scipy.integrate库具有单积分,双倍,三倍,多重,高斯四边形,罗姆贝格,梯形和辛普森规则。
示例:现在以单集成为例
这里a是上限,b是下限
from scipy import integrate
# take f(x) function as f
f = lambda x : x**2
#single integration with a = 0 & b = 1
integration = integrate.quad(f, 0 , 1)
print(integration)
Output:
(0.33333333333333337, 3.700743415417189e-15)
在此函数返回两个值,其中第一个值是积分,第二个值是积分中的估计误差。
示例:现在以双重集成为例。 我们发现以下等式的双重积分,
from scipy import integrate
import numpy as np
#import square root function from math lib
from math import sqrt
# set fuction f(x)
f = lambda x, y : 64 *x*y
# lower limit of second integral
p = lambda x : 0
# upper limit of first integral
q = lambda y : sqrt(1 - 2*y**2)
# perform double integration
integration = integrate.dblquad(f , 0 , 2/4, p, q)
print(integration)
Output:
(3.0, 9.657432734515774e-14)
您已经看到上面的输出与先前的输出相同。