SciPy个人学习笔记【持续更新】

SciPy个人学习笔记【持续更新】

来源:SciPy教程

目录

SciPy子包

SciPy常量

 SciPy快速傅里叶变换

一维离散傅里叶变换

离散余弦变换

 SciPy积分

单积分

双重积分

SciPy插值 

一维插值

SciPy输入和输出

MATLAB

SciPy线性代数

解线性方程组

查找行列式

特征值和特征向量

奇异值分解 

SciPy Ndimage 

边缘检测 

SciPy子包

子包  
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常量

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快速傅里叶变换

对时域信号计算傅里叶变换可用于信号和噪声处理,图像处理,音频信号处理等领域。

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)

 SciPy积分

编号 示例 描述
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变量的下限和上限,而gfunhfun是定义变量y的下限和上限的函数名称。

例如:

即使gh是常数,它们可能在很多情况下必须定义为函数。

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插值 

使用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()

SciPy输入和输出

MATLAB

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线性代数

解线性方程组

#导入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)

SciPy Ndimage 

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)

边缘检测 

最常用的边缘检测算法包括 -

  • 索贝尔(Sobel)
  • 坎尼(Canny)
  • 普鲁伊特(Prewitt)
  • 罗伯茨Roberts
  • 模糊逻辑方法

ndimage提供了一个叫Sobel函数来检测彩色块的边缘。 而NumPy提供了Hypot函数来将两个合成矩阵合并为一个。

你可能感兴趣的:(SciPy)