Scipy学习

Scipy简介

Scipy依赖于Numpy(np.dot(nd1,nd2),Scipy提供了真正的矩阵
SciPy是基于Python的NumPy扩展构建的数学算法和便利函数的集合。
numpy 数字化python numeric python ---------> numpy
scipy科学化的python science python -----------> scipy
numpy和scipy同一个官方网站
scipy 高级科学计算工具
[scipy科学计算](https://wizardforcel.gitbooks.io/scipy-lecture-notes/content/0.html)

Scipy功能

Scipy包含的功能:最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理、图像处理、常微分方程求解器等
Scipy由一些特定功能的子模块组成
在这里插入图片描述

插值功能scipy.interpolate

SciPy提供了几种通用插值工具,可用于1、2和更高维度的数据:
表示一interp1d维插值()的类,提供了几种插值方法。
便利功能griddata提供了一个简单的接口,可插接N个维度(N = 1、2、3、4,...)。还提供了用于基础例程的面向对象的接口。
基于FORTRAN库FITPACK的一维和二维(平滑)三次样条插值函数。它们既是FITPACK库的过程接口,又是面向对象的接口。
使用径向基函数进行插值。
import numpy as np
from scipy import interp
import matplotlib.pyplot as plt
%matplotlib inline

#25份 代表25个点
X=np.linspace(0,2*np.pi,10)
y=np.sin(X)
plt.scatter(X,y,color='red')

在这里插入图片描述

#X2范围也是0~2pi 分成了55份 需要目标值y2
#使用scipy中的插值方法 生成y2
#X --- y关系 X2---y2 根据这个关系进行插值
plt.figure(figsize=(12,9))
X2=np.linspace(0,2*np.pi,55)
#One-dimensional linear interpolation -维线性插值
y2=interp(X2,X,y)
plt.scatter(X2,y2) #差值得到的结果和标准正弦波 存在差异
plt.scatter(X,y,color='red')
plt.plot(X2,np.sin(X2),color='green') #标准的正弦波
#原来的点是10个 现在要插成55个 两点之间 以线性方式进行平均插值

在这里插入图片描述
一维线性插值:当数据存在缺失时可以通过线性插值补全
之前处理数据缺失时:

  • 填充平均值
  • 填充中位数
  • 众数
  • 根据实际情况进行填写,如性别

现在应用:如果数据存在时间序列 可以采用线性插值
还有其他插值方式:例如:拉格朗日中值定理插值法(高阶插值方法)
算法 回归算法(延伸一下,就是’插值’)
回归算法model.fit(X,y) 使用model.predict(X_test)
Kmeans聚类 聚类之后(有相近的数据) 进行填充
官方示例 可以练习官网提供的案例

积分功能

官网案例

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate

X 2 + Y 2 = 1 X^2 + Y^2 = 1 X2+Y2=1
s = π r 2 s=\pi r2 s=πr2
令 r = 1 s = π 令r=1 s=\pi r=1s=π
f ( x ) = y = ( 1 − X 2 ) 0.5 f(x)=y=(1-X^2)^{0.5} f(x)=y=(1X2)0.5

f=lambda x:(1-x**2)**0.5

X=np.linspace(-1,1,100)
y=f(X)
plt.plot(X,y)
plt.plot(X,-y)
plt.axis('equal')

在这里插入图片描述

#Compute a definite integral 计算定积分
#f就是圆的方程 圆的上半部分
result,error=integrate.quad(f,-1,1)
result*2
#3.1415926535897967

快速傅里叶变换

scipy.fft :fast fourier transform
时域 ---------------------- 频域
花花世界(大千世界) – 本质
数据分析的一种方式傅里叶变换 将原始数据还原为本质
应用在信号处理领域:
噪声 声音 噪声 听不见 技术处理 将噪声去除
下面的案例 是一张图片:
图片的数据 可以认为是’信号’
傅里叶变换

  • 原始数据(时域)------>频域(本质)

官方案例

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#数据(时域 肉眼看到的)--->频域(波 变化 波动情况)
#傅里叶 transform 2 图片是二维的
#ifft2 inverse反转--->变成 原始数据
from scipy.fftpack import fft2,ifft2

moon=plt.imread('./moonlanding.png')
plt.figure(figsize=(12,9))
#噪声 特定:不平 不光滑
#如果图片中没有噪声:平,光滑
#频域,噪声的地方 波动比较剧烈 数值比较大 过滤掉 可以了
plt.imshow(moon,cmap=plt.cm.gray)

在这里插入图片描述

#第一步 快速傅里叶变换
fft2_moon=fft2(moon)
#array([[126598.45+0.j,...) #j代表虚数
np.abs(fft2_moon).mean() #51.193375

#第二步 过滤掉异常值 绝对值 比较大的值 波动情况剧烈 就说明 存在噪声
#过滤时 根据10倍平均值 是我们的阈值510
fft2_moon[np.abs(fft2_moon)>510]=0
fft2_moon

#第三部 傅里叶变换反转 频域 转换成时域
moon2=ifft2(fft2_moon)
moon2

#第四部 去除虚数部分,只显示实数部分
moon2=np.real(moon2)
plt.figure(figsize=(122,9))
plt.imshow(moon2,cmap=plt.cm.gray)

在这里插入图片描述

两个正弦之和的FFT
from scipy import fft
# 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)


# 傅里叶变换Compute the one-dimensional discrete Fourier Transform.
yf = fft(y)
xf = np.linspace(0.0, N*T, N)
plt.plot(xf, 2.0/N * np.abs(yf[0:N]))
plt.plot(x,y)
plt.grid()
plt.show()

在这里插入图片描述

plt.plot(x,0.5*np.sin(80.0 * 2.0*np.pi*x))

在这里插入图片描述

plt.plot(x,np.sin(50.0 * 2.0*np.pi*x)

在这里插入图片描述

plt.plot(x,y)

在这里插入图片描述

矩阵

import numpy as np
#matrix:矩阵
from scipy import matrix

a = np.random.randint(0,150,size = (4,5))
# 数组,严格意义上来说,它不是矩阵
a
#array([[ 25,  88,  12, 100,  29],
#       [132, 148, 110,   0,  12],
#       [ 61,  37,  98, 145,  66],
#       [ 14,  90, 108, 108,  62]])

A=matrix(a)
A
#matrix([[ 25,  88,  12, 100,  29],
#        [132, 148, 110,   0,  12],
#        [ 61,  37,  98, 145,  66],
#        [ 14,  90, 108, 108,  62]])

B=np.matrix(a)
B
#matrix([[ 25,  88,  12, 100,  29],
#        [132, 148, 110,   0,  12],
#        [ 61,  37,  98, 145,  66],
#        [ 14,  90, 108, 108,  62]])

B.dot(A.T)
#matrix([[19354, 17992, 22371, 22164],
#        [17992, 51572, 25100, 27792],
#        [22371, 25100, 40075, 34520],
#        [22164, 27792, 34520, 35468]])

信号处理

signal misic
所有类型的数据 都可以看做是信号
今天 信号 理解广度和深度 加深 数据都是信号
信号处理就是通过代码进行对数据处理,比如收集到的一些信号数据,对它进行处理变得更加清晰。

import numpy as np
from scipy import signal, misc #提供了一些图片数据
import matplotlib.pyplot as plt

face = misc.face(gray = True)
plt.imshow(face,cmap = plt.cm.gray)

在这里插入图片描述

image = misc.face(gray=True).astype(np.float32)
derfilt = np.array([1.0, -2, 1.0], dtype=np.float32)

ck = signal.cspline2d(image, 8.0)
deriv = (signal.sepfir2d(ck, derfilt, [1]) +
         signal.sepfir2d(ck, [1], derfilt))
plt.imshow(deriv,cmap = plt.cm.gray)

在这里插入图片描述

#进行卷积滤波
laplacian = np.array([[0,1,0], [1,-4,1], [0,1,0]], dtype=np.float32)
deriv2 = signal.convolve2d(ck,laplacian,mode='same',boundary='symm')
plt.imshow(deriv2,cmap = plt.cm.gray)

在这里插入图片描述

#几种过滤方式
#  'blur', 'contour', 'detail', 'edge_enhance', 'edge_enhance_more',
#         'emboss', 'find_edges', 'smooth', 'smooth_more', 'sharpen'.
# plt.imshow(face,cmap = 'gray')
img = misc.imfilter(face,'smooth') #emboss 浮雕形式
plt.imshow(img,cmap = plt.cm.gray)

在这里插入图片描述

moon = plt.imread('./moonlanding.png')
plt.figure(figsize=(12,9))
plt.imshow(moon,cmap = 'gray')

在这里插入图片描述

moon2 = misc.imfilter(moon,'smooth')
plt.figure(figsize=(12,9))
plt.imshow(moon2,cmap = 'gray')

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值