来源:SciPy教程
目录
SciPy子包
SciPy常量
SciPy快速傅里叶变换
一维离散傅里叶变换
离散余弦变换
SciPy积分
单积分
双重积分
SciPy插值
一维插值
SciPy输入和输出
MATLAB
SciPy线性代数
解线性方程组
查找行列式
特征值和特征向量
奇异值分解
SciPy Ndimage
边缘检测
子包 | |
---|---|
scipy.cluster | 矢量量化/Kmeans |
scipy.constants | 物理和数学常数 |
scipy.fftpack | 傅里叶变换 |
scipy.integrate | 集成例程 |
scipy.interpolate | 插值 |
scipy.io | 数据输入和输出 |
scipy.linalg | 线性代数例程 |
scipy.ndimage | n维图像包 |
scipy.odr | 正交距离回归 |
scipy.optimize | 优化 |
scipy.signal | 信号处理 |
scipy.sparse | 稀疏矩阵 |
scipy.spatial | 空间数据结构和算法 |
scipy.special | 任何特殊的数学函数 |
scipy.stats | 统计 |
scipy.constants
包提供了各种常量。
数学常量
编号 | 常量 | 描述 |
---|---|---|
1 | pi |
PI值 |
2 | golden |
黄金比例 |
物理常量
编号 | 常量 | 描述 |
---|---|---|
1 | c |
真空中的光速 |
2 | speed_of_light |
真空中的光速 |
3 | h |
普朗克常数 |
4 | Planck |
普朗克常数h |
5 | G |
牛顿的引力常数 |
6 | e |
基本电荷 |
7 | R |
摩尔气体常数 |
8 | Avogadro |
阿伏加德罗常数 |
9 | k |
波尔兹曼常数 |
10 | electron_mass 或者 m_e |
电子质量 |
显然要记住所有常量十分困难,我们可以通过使用scipy.constants.find()
方法获取指定键。
例如:
import scipy.constants
res = scipy.constants.physical_constants["alpha particle mass"]
print (res)
结果:
(6.64465723e-27, 'kg', 8.2e-35)
对时域信号计算傅里叶变换可用于信号和噪声处理,图像处理,音频信号处理等领域。
SciPy提供fftpack
模块,可让用户计算快速傅立叶变换。
from scipy.fftpack import fft
from scipy.fftpack import ifft
x = np.array([1.0, 2.0, 1.0, -1.0, 1.5])
y = fft(x) #应用傅里叶变换
yinv = ifft(y) #应用逆傅里叶变换
print (yinv)
执行结果
[ 1.0+0.j 2.0+0.j 1.0+0.j -1.0+0.j 1.5+0.j]
scipy.fftpack.fftfreq() #
生成采样频率
scipy.fftpack.fft()
#计算快速傅里叶变换。
dct()离散余弦变换:
from scipy.fftpack import dct
mydict = dct(np.array([4., 3., 5., 10., 5., 3.]))
print(mydict)
idct()逆离散余弦变换:
from scipy.fftpack import dct
from scipy.fftpack import idct
d = idct(np.array([4., 3., 5., 10., 5., 3.]))
print(d)
编号 | 示例 | 描述 |
---|---|---|
1 | quad |
单积分 |
2 | dblquad |
二重积分 |
3 | tplquad |
三重积分 |
4 | nquad |
n倍多重积分 |
5 | fixed_quad |
高斯积分,阶数n |
6 | quadrature |
高斯正交到容差 |
7 | romberg |
Romberg积分 |
8 | trapz |
梯形规则 |
9 | cumtrapz |
梯形法则累计计算积分 |
10 | simps |
辛普森的规则 |
11 | romb |
Romberg积分 |
12 | polyint |
分析多项式积分(NumPy) |
13 | poly1d |
辅助函数polyint(NumPy) |
quad
的一般形式是scipy.integrate.quad(f,a,b)
,其中'f'
是要积分的函数的名称。 而'a'
和'b'
分别是下限和上限。
例如:
import scipy.integrate
from numpy import exp
f= lambda x:exp(-x**2)
i = scipy.integrate.quad(f, 0, 1)
print (i)
返回结果
(0.7468241328124271, 8.291413475940725e-15)
其中第一个数字是积分值,第二个数值是积分值绝对误差的估计值。
dblquad
的一般形式是scipy.integrate.dblquad(func,a,b,gfun,hfun)
。 其中,func
是要积分函数的名称,'a'
和'b'
分别是x
变量的下限和上限,而gfun
和hfun
是定义变量y
的下限和上限的函数名称。
例如:
即使g
和h
是常数,它们可能在很多情况下必须定义为函数。
import scipy.integrate
from numpy import exp
from math import sqrt
f = lambda x, y : 16*x*y
g = lambda x : 0
h = lambda y : sqrt(1-4*y**2)
i = scipy.integrate.dblquad(f, 0, 0.5, g, h)
print (i)
使用scipy.interpolate
包进行插值
例如:
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4)
print (x,y)
如上可得到两个数组。
假设这两个数组作为空间点的两个维度,使用下面的程序进行绘图。
plt.plot(x, y,’o’)
plt.show()
scipy.interpolate
中的interp1d
类是一种创建基于固定数据点的函数的便捷方法,可以使用线性插值在给定数据定义的域内的任意位置评估该函数。
f1 = interp1d(x, y,kind = 'linear') #线性
f2 = interp1d(x, y, kind = 'cubic') #立方
我们可以通过创建更多长度的新输入查看插值的明显区别。
xnew = np.linspace(0, 4,30)
plt.plot(x, y, 'o', xnew, f1(xnew), '-', xnew, f2(xnew), '--') # 三个不同类型分别显示点,实线,虚线。
plt.legend(['data', 'linear', 'cubic','nearest'], loc = 'best')
plt.show()
1 | loadmat |
加载一个MATLAB文件 |
2 | savemat |
保存为一个MATLAB文件 |
3 | whosmat |
列出MATLAB文件中的变量 |
例如:
import scipy.io as sio
import numpy as np
#保存一个mat文件
vect = np.arange(10)
sio.savemat('array.mat', {'vect':vect})
#加载刚刚保存的mat文件
mat_file_content = sio.loadmat('array.mat')
print (mat_file_content)
如果想在不读取数据到内存的情况下检查MATLAB文件的内容 ,可利用whosmat命令。
import scipy.io as sio
mat_file_content = sio.whosmat(‘array.mat’)
print (mat_file_content)
#导入scipy和numpy包
import numpy as np
#声明numpy数组
a = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]])
b = np.array([2, 4, -1])
#传递参数给求解函数
x = linalg.solve(a, b)
#打印结果
print (x)
在SciPy中可使用det()函数来求行列式
scipy.linalg.eig
从普通或广义特征值问题计算特征值。 该函数返回特征值和特征向量。
from scipy import linalg
import numpy as np
A = np.array([[1,2],[3,4]])
l, v = linalg.eig(A)
#输出特征值
print (l)
#输出特征向量
print (v)
存在一个分解使得
其中U是m×m阶酉矩阵;Σ是半正定m×n阶对角矩阵;而V*,即V的共轭转置,是n×n阶酉矩阵。这样的分解就称作M的奇异值分解。Σ对角线上的元素Σi,其中Σi即为M的奇异值。
用法:
from scipy import linalg
import numpy as np
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)
U, s, Vh = linalg.svd(a)
print (U, Vh, s)
ndimage
模块专用于图像处理。ndimage
表示一个n
维图像。
首先显示图像:
from scipy import misc
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)使用包内自带图像
import matplotlib.pyplot as plt
plt.imshow(f)
plt.show()
裁剪图象:
from scipy import misc
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)
lx, ly = face.shape
crop_face = face[int(lx/4): -int(lx/4), int(ly/4): -int(ly/4)]
import matplotlib.pyplot as plt
plt.imshow(crop_face)
plt.show()
倒置图像:flipud()矩阵翻转
from scipy import misc
face = misc.face()
flip_ud_face = np.flipud(face)
import matplotlib.pyplot as plt
plt.imshow(flip_ud_face)
plt.show()
旋转图像:rotate()
from scipy import misc,ndimage
face = misc.face()
rotate_face = ndimage.rotate(face, 45) #旋转45度
import matplotlib.pyplot as plt
plt.imshow(rotate_face)
plt.show()
模糊图像: sigma表示模糊程度
ndimage.gaussian_filter(face, sigma=3)
最常用的边缘检测算法包括 -
ndimage
提供了一个叫Sobel
函数来检测彩色块的边缘。 而NumPy提供了Hypot
函数来将两个合成矩阵合并为一个。