Scipy

import numpy as np
import matplotlib.pyplot as plt
import scipy.misc as misc # 图片处理 miscellaneous 乱七八糟
# 在导入scipy的时候 可能会报错 pip install scipy -i https://mirrors.aliyun.com/pypi/simple/
图片的灰度化处理
# 图片的灰度化处理 其实就是 把 最后一个维度的[r,g,b]  变成一个值
# 取最大值 取平均值 加权平均值 [r:g:b] [0.64:0.35:0.01]
cat.max()  # max()是整个数组中的最大值
cat.max(axis=-1)
cat.max(axis=-1).shape
# 最大值
# plt.imshow(cat.max(axis=-1),cmap='gay')  # 需要设置颜色映射 spring 值故意写错 报错信息中会提示可用的颜色映射
plt.imshow(cat.max(axis=-1),cmap='gray')  #
# 平均值
cat.mean(axis=-1)
plt.imshow(cat.mean(axis=-1),cmap='gray')
# 加权平均值 权重 [r:g:b] [0.64:0.35:0.01]  1 [3,4] [[],[]]
cat
weight = np.array([0.64,0.35,0.01])
cat2 = np.dot(cat,weight)
plt.imshow(cat2,cmap="gray")

通过傅里叶变换实现图片降噪

scipy.fftpack模块用来计算快速傅里叶变换
速度比传统傅里叶变换更快,是对之前算法的改进
图片是二维数据,注意使用fftpack的二维转变方法

from scipy.fftpack import fft2,ifft2
# 傅里叶变换 就是 把描述值的值 变成描述变化的值
moon
fft_moon = fft2(moon)  # 把描述值的值变成 描述变化的值
fft_moon[np.abs(fft_moon) > 2000] = 0  # 把变化大的 找出来 然后让变化归零
fft_moon 
fft_moon  # 处理之后 把描述变化的值 再恢复成描述值的值
ifft_moon = np.real(ifft2(fft_moon))
plt.figure(figsize=(12,9))
plt.imshow(ifft_moon,cmap='gray')
plt.imsave('after.png',ifft_moon,cmap='gray')

图片进行过滤
添加噪声,对噪声图片使用ndimage中的高斯滤波、中值滤波、signal中维纳滤波进行处理
使图片变清楚

添加噪声

加载图片,使用灰色图片misc.face()添加噪声

face = misc.face(gray=True)
plt.imshow(face,cmap='gray')
face.shape
noise = np.random.randint(0,100,size=face.shape)
plt.imshow(noise,cmap='gray')
noise_face = face + noise
plt.imshow(noise_face,cmap='gray')

ndimage处理噪声

median中值滤波参数size:给出在每个元素上从输入数组中取出的形状位置,定义过滤器功能的输入

gaussian高斯滤波参数sigma:高斯核的标准偏差

signal维纳滤波参数mysize:滤镜尺寸的标量

import scipy.ndimage as ndimage
# size 设定了选取范围的大小
mf_data = ndimage.median_filter(noise_face,size=5)
mf_data = ndimage.median_filter(moon,size=5)
plt.imshow(mf_data,cmap='gray')
# 高斯滤波 sigma也是指定范围
gf_data = ndimage.gaussian_filter(noise_face,sigma=2)
gf_data = ndimage.gaussian_filter(moon,sigma=2)
plt.imshow(gf_data,cmap='gray')# 高斯滤波 sigma也是指定范围
gf_data = ndimage.gaussian_filter(noise_face,sigma=2)
gf_data = ndimage.gaussian_filter(moon,sigma=2)
plt.imshow(gf_data,cmap='gray')
# 维也纳滤波 是选定一个范围 然后 通过调整值 让方差尽量小
from scipy.signal import wiener
w_data = wiener(noise_face,mysize=5)
w_data = wiener(moon,mysize=5)
plt.imshow(w_data,cmap='gray')

使用scipy.ndimage图片处理

使用scipy.misc.face(gray=True)获取图片,使用ndimage移动坐标、旋转图片、切割图片、缩放图片

import scipy.ndimage as ndimage
import scipy.misc
face = scipy.misc.face(gray=True)
face
plt.imshow(face,cmap='gray')
# shift 移动矩阵 参数 input要移动的矩阵  shift移动的值
shift1 = ndimage.shift(input=face,shift=100)  # 往右往下都是100
shift1 = ndimage.shift(input=face,shift=[-100,200])  # 先上下 后左右
shift1
# 参数 mode='constant'用来指定填充模式 默认constant是用0来填充  {'reflect', 'constant', 'nearest', 'mirror', 'wrap'}
shift1 = ndimage.shift(input=face,shift=[-100,200],mode='wrap')
plt.imshow(shift1,cmap='gray')
# 用来旋转图片 input要旋转的矩阵 angle旋转多少度
# rotate1 = ndimage.rotate(input=face,angle=45)
rotate1 = ndimage.rotate(input=face,angle=90)
rotate1
plt.imshow(rotate1,cmap='gray')
# 对矩阵进行缩放 input要缩放的矩阵 zoom放大的倍数
# z1 = ndimage.zoom(input=face,zoom=0.5)
# z1 = ndimage.zoom(input=face,zoom=2)
# z1 = ndimage.zoom(input=face,zoom=[0.5,1])
# z1 = ndimage.zoom(input=face,zoom=[1,0.5])
z1 = ndimage.zoom(input=face,zoom=[500/768,500/1024])  # 500,500
z1
plt.imshow(z1,cmap='gray')
plt.imshow(face[:500,400:900],cmap='gray')
face = scipy.misc.face()
plt.imshow(face)

求解圆周率

因为圆形的面积为 pi * r**2

只要求得面积 即可得到pi

想得到圆形面积 可以先绘制一个圆形 然后求积分

对函数(1 - x2)0.5进行积分

# x**2 + y**2 = 1
# y**2 = 1 - x**2
# y = (1-x**2)**0.5
f = lambda x:(1-x**2)**0.5
x = np.linspace(-1,1,100)
x
y = f(x)
y
plt.figure(figsize=(5,5))
plt.plot(x,y)
plt.plot(x,-y)

求圆的面积 (使用scipy.integrate进行积分,调用quad()方法)

import scipy.integrate as integrate
# func 对应关系(函数), a是x轴的起始值, b是x轴的终止值
res,error = integrate.quad(f,-1,1)  # 半径是1的圆形 面积 pi 
print('圆周率是:',res*2,'误差是:',error*2)

线形图

简单的Series图表示例,plot()

# 正弦曲线
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
s = Series(data=y,index=x)
s.plot()

简单的DataFrame图表示例,plot()

x = np.linspace(0,2*np.pi,100)
df = DataFrame(data={'sin':np.sin(x),'cos':np.cos(x)},index=x)
df
df.plot()

柱状图

Series柱状图示例,kind = 'bar'/'barh'

s = Series(data=np.random.randint(0,10,size=5),index=list('abcde'))
# s.plot(kind='bar')
s.plot(kind='barh')

DataFrame柱状图示例

df = DataFrame(np.random.randint(0,10,size=(8,4)),index=list('abcdefgh'),columns=list('ABCD'))
df.plot(kind='bar')
df.plot(kind='barh')

直方图

rondom生成随机数百分比直方图,调用hist方法

s = Series(np.random.randint(0,10,size=10))
s
s.hist()
s = Series(np.random.normal(loc=0,scale=5,size=10000))
s.hist()

随机数百分比密度图s.plot(kind = 'kde')

s.plot(kind='kde')

这两种图表经常被画在一起。直方图以规格化形式给出(以便给出面元化密度),然后再在其上绘制核密度估计。接下来来看一个由两个不同的标准正态分布组成的的双峰分布

np.random.normal()正太分布函数

直方图hist,函数中必须添加属性density = True

ndarr1 = np.random.normal(loc=-10,scale=5,size=5000)
ndarr2 = np.random.normal(loc=15,scale=2,size=5000)
ndarr = np.concatenate([ndarr1,ndarr2])
s = Series(ndarr)
s.plot(kind='kde')  # 核心 密度 估计 用来展示某个位置出现内容的概率的估计值
s.hist(density=True)  # density表示直方图也以 密度概率的值来展示  hist用来展示某个位置出现内容的实际频率

散布图

散布图 散布图是观察两个一维数据数列之间的关系的有效方法

注意使用kind = 'scatter'时,给明标签columns

df = DataFrame(np.random.randint(0,150,size=(20,3)),columns=['python','math','eng'])
df
df.plot(kind='scatter',x='python',y='eng')
np.random.randint(-10,10,1)[0]
df['php'] = df['python'].map(lambda x: x*0.9+np.random.randint(-10,10,1)[0])
df.plot(kind='scatter',x='python',y='php')

推荐阅读更多精彩内容