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.ndimagen维图像包
scipy.odr正交距离回归
scipy.optimize优化
scipy.signal信号处理
scipy.sparse稀疏矩阵
scipy.spatial空间数据结构和算法
scipy.special任何特殊的数学函数
scipy.stats

统计

SciPy常量

scipy.constants包提供了各种常量。

数学常量

编号常量描述
1piPI值
2golden黄金比例

物理常量

编号常量描述
1c真空中的光速
2speed_of_light真空中的光速
3h普朗克常数
4Planck普朗克常数h
5G牛顿的引力常数
6e基本电荷
7R摩尔气体常数
8Avogadro阿伏加德罗常数
9k波尔兹曼常数
10electron_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积分

编号示例描述
1quad单积分
2dblquad二重积分
3tplquad三重积分
4nquadn倍多重积分
5fixed_quad高斯积分,阶数n
6quadrature高斯正交到容差
7rombergRomberg积分
8trapz梯形规则
9cumtrapz梯形法则累计计算积分
10simps辛普森的规则
11rombRomberg积分
12polyint分析多项式积分(NumPy)
13poly1d辅助函数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

1loadmat加载一个MATLAB文件
2savemat保存为一个MATLAB文件
3whosmat列出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函数来将两个合成矩阵合并为一个。

  • 13
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值