《封号码罗》数据分析与人工智能之scipy(五)

第一部分

import numpy as np
import scipy as sp
import time
from scipy.io import wavfile  # 可以读取无损.WAV格式的音频文件
import matplotlib.pyplot as plt
from matplotlib import pyplot
# 傅里叶变换         时域--------------》频域
#               人看到的数据样子       最真是、最原始、最基本的样子
#                    现象                本质
#                           由表及里

# fft 处理一维数据   ifft2 == inverse 反转
from scipy.fftpack import fft2, ifft2  # 库中的傅里叶变换模快

# scipy.fftpack模快用来计算快速傅里叶变换
# 速度比传统傅里叶变换更快,是对之前算法的改进
# 图片是二维数据,主意使用fftpack的二维转变方法
moon = plt.imread("./moon.jpg")
# plt.figure(figsize=(9, 6))
# plt.imshow(moon, cmap=plt.cm.gray)  # camp定义显示什么颜色 cm中的颜色常量gray灰色
# pyplot.show()

# 将图片对象给到傅里叶变化,查看数据波动
mf = fft2(moon)
# 计算所有数据波动频率平均值
# dd = np.abs(mf)     # 先给绝对值,去掉负数和虚数 虚数就是  1.1j 类似的数据
# dd = np.abs(mf).mean()  # 求出平均值 599.3810195414912

# 大于10倍平均值的波动比较大,过滤掉
# cond = np.abs(mf) > 5990  # 得到一个条件

# 过滤数据,并重新赋值为常量0
# mf[cond] = 0
# 现在mf是频域状态,无法直接显示图片,需要反转成时域,变为肉眼看见的图片
# moon = ifft2(mf)  # 数据里面依然有虚数
# moon_shishu = np.real(moon)  # 使用real()方法去除虚数,返回实数图片数据
# plt.figure(figsize=(9, 6))
# plt.imshow(moon_shishu, cmap=plt.cm.gray)  # camp定义显示什么颜色 cm中的颜色常量gray灰色
# pyplot.show()


# 图片中的数据不平滑-----》导致内容不协调-------》称为波动比较大
# 傅里叶变换,时域-----》频域(就是波动)
# 将波动大的数据过滤掉,保留下的数据自然平滑,降噪

# 数值积分,求解圆周率
# integrate对函数(1-x^2)^0.5进行积分
# x**2 + y**2 = 1所表示的曲线是以O(0,0)为圆心,以1单位长度为半径的圆;   A 面积pi*r^2
# x**2 + y**2 = r**2所表示的曲线是以O(0,0)为圆心,以r为半径的圆;        B
# (x-a)**2 + (y-b)**2 = r**2所表示的曲线是以O(a,b)为圆心,以r为半径的圆。C
# 以A为例,
# y =(1-x**2)**0.5
c = lambda x: (1 - x ** 2) ** 0.5  # 圆的上半部份
x = np.linspace(-1, 1, 100)
y = c(x)
# plt.figure(figsize=(5, 5))
# plt.plot(x, y)  # 上半圆
# plt.plot(x, -y)  # 下半圆
# pyplot.show()

# 开始推导 s=pi*r**2 ---> pi=s/(r**2) 当圆半径r为1----> pi=s
# 这个时候面积s就等于pi,从半圆着手求s,求上半部分的面积*2就是pi
# 上半部分的面积已知y是一个lambda函数  y = c(x)  ---> c = lambda x: (1 - x ** 2) ** 0.5
# 使用scipy.integrate进行积分,调用quad()方法  quad()定积分,有确定的空间,比如这里x是-1,1
from scipy.integrate import quad

#   定积分,第一个参数是y的函数方程,第二、第三是开始和结束的距离,返回元组(值,误差值)[0] * 2 =面积 也= pi
s = quad(c, -1, 1)[0] * 2
# print(s) 3.1415926535897967

# scipy文件输入、输出
from scipy import io

# io.savemat("moon.mat", mdict={"moon": moon_shishu})  # 保存二进制文件
#                               显示名字   保存时命名的名字
dd = io.loadmat("moon.mat", mdict={"moon": moon})
# 随机生成数组,使用scipy中的io.savemat()保存
# 文件格式是.mat,标准的二进制文件

# 读写图片使用scipy中的misc.imread()/imsave()
from scipy import misc  # 1.2.0时弃用
# from scipy.misc import imageio  没有这个属性
# ImportError: cannot import name 'imageio' from 'scipy.misc'
# pip install imageio
import imageio
from PIL import Image
from PIL import ImageFilter

footprint = imageio.imread("./jiaoyin.jpeg")  # misc.imreda()
# size的值是int表示原来的多少,float原来的百分多少,元组,重新修改宽高
# img = np.array(Image.fromarray(footprint),resize(size=(1000, 500)))   # misc.imresize()
# img = np.array(Image.fromarray(footprint).rotate(90)) # misc.imrotate()
img = np.array(Image.fromarray(footprint).filter(ImageFilter.SMOOTH))  # misc.imfilter()  滤波操作
# ImageFilter各种介绍https://blog.csdn.net/weixin_41571493/article/details/82688314
# print(img)
# print(footprint)  是一个数组对象
# plt.imshow(img)
# pyplot.show()

from scipy import ndimage  # n维图像工具包

# 使用scipy.misc.face(gray=True)获取图片,使用ndimage移动坐标,旋转图片,切割图片,缩放图片
face = misc.face(gray=False)
#                         高不动,宽向右200,颜色不动  cval默认移动后原来部位是黑色,现在255设置为白色
# face2 = ndimage.shift(face, shift=[0, 200, 0], cval=255)
# face2 = ndimage.shift(face, shift=[0, 200, 0], mode="reflect")      # 反射 反射值为移动的值
face3 = ndimage.rotate(face, angle=10, mode="mirror")  # 旋转  角度值为30 填充模式为镜像
# face4 = ndimage.zoom(face, zoom=[0.2, 0.2, 1颜色不变(1/3灰色,4/3透明)], mode="mirror")  # 缩放 宽0.1,高0.1 颜色不修改为1
# print(face3.shape)

# 图片进行过滤 添加噪声,对招生图片使用高斯滤波,种植滤波,signal中维纳滤波进行处理,是图片变清晰
# 加载图片,使用灰色图片misc.face()添加噪声
# 滤波原理和上面93行Image.fromarray(footprint).filter(ImageFilter.SMOOTH)原理一样,都是卷积操作

# 高斯滤波sigma:高斯核的标准偏差
# 高斯分布,正态分布,概率不一样
# moon = ndimage.gaussian_filter(moon, sigma=2)

# 中值滤波参数size:给出在每个元素上从输入数组中取出的形状位置,定义过滤器功能的输入
moon = ndimage.median_filter(moon, size=5)
# signal维纳滤波mysize:滤镜尺寸的标量      无栗子


plt.figure(figsize=(9, 6))
# plt.imshow(face3)
plt.imshow(moon, cmap=pyplot.cm.gray)
pyplot.show()

start = time.perf_counter()
print()
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")

第二部分

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot
import time
# 有七种可用的稀疏矩阵类型:
#   csc_ matrix:压缩的稀疏列格式
#   csr_ matrix:压缩的稀疏行格式
#   bsr_ matrix:块稀疏行格式
#   lil_ matrix:列表格式
#   dok_ matrix:关键字字典格式
#   coo_ matrix:COOrdinate格式(又名IJV,三联体格式)
#   dia_ matrix:对角格式
from scipy import matrix  # 虽然报红,还是能用
from scipy.sparse import csc_matrix, csr_matrix, bsr_matrix, lil_matrix, dok_matrix, coo_matrix, dia_matrix
from scipy import sparse

# 普通矩阵 dense 稠密的 sparse 稀松的
a = matrix(np.random.randint(0, 10, size=(4, 5)))
b = matrix(np.random.randint(0, 10, size=(5, 4)))
dd = a.dot(b)  # 点积

s = np.random.randint(0, 100, size=(10000, 10000))
s[s < 98] = 0  # s里面小于98的元素给值为0
# 稀松矩阵,大部分是0,小部分是非零数据 把稠密矩阵转成稀松矩阵
s1 = csc_matrix(s)  # 只表示非零的数据,0的话就不统计了,大大减少内存占用
# sparse.save_npz("./sparse.npz", s1)

start = time.perf_counter()
print(s1, s1.shape)  # 数据的形状没有改变
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")

第三部分

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot
import time

# 线形图
s = Series(np.random.randint(0, 10, size=10))
# s.plot(kind="kde")  # 直接调用这个方法,不需要使用 plt.imshow()
# kind的参数
#   hist:统计数据出现的频次
#   box: 箱式图可以看到数据的分布情况,如最大值,最小值,中位数等
#   kde: 概率分布图(密度图) 约等于 density
# bins的值 划分数据区间,默认划分10个等级
# range=[0, 10]  默认横坐标是数据的开始和结束,range是自定义x轴的显示起始和结束

df = DataFrame(np.random.randint(0, 150, size=(10, 2)), columns=["Python", "En"], index=list("ABCDEFHIJK"))
df["Math"] = df["Python"].map(lambda x: x + np.random.randint(-10, 10, size=1)[0])

# 柱状图
# df.plot(kind="bar")

# 直方图
s2 = Series(np.random.randn(1000))  # 正态分布
# normed相当于归一化操作  值到了0~1之间
# s2.plot(kind="hist", bins=100, normed=True)   # 被废弃了,和下面density效果一样
# s2.plot(kind="hist", bins=100, density=True)
# s2.plot(kind="kde", color="red")  # 密度图

# 散点图 是观察两个一维数据数列之间的关系的有效方法
# 在使用scatter时,给明标签columns,是哪两者之间的数据关系
# df.plot(x="Python", y="En", kind="scatter")
# df.plot(x="Python", y="Math", kind="scatter")  # 可以看得出来两者之间存在一个线性关系

# 散点图矩阵,当有多个点时,两两点之间的关系
# 函数 pd.plotting.scatter_matrix(),主意参数diagnol:对角线的图标样式
pd.plotting.scatter_matrix(df, alpha=1, diagonal="kde")

pyplot.show()

start = time.perf_counter()
# print(df)
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")

第四部分

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot
import time

# 异常值(空值)填充  空数据的补全


# 线性插值法
# from scipy import interp
# scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead Y = interp(X, x, y)
from numpy import interp

x = np.linspace(0, 2 * np.pi, 10)  # 0到2π
y = np.sin(x)
# plt.plot(x, y)

X = np.linspace(0, 2 * np.pi, 40)
# 线性插值  一维的线性插值
Y = interp(X, x, y)
# plt.plot(X, Y, marker="o")

# 拉格拉日插值法
# 使用算法进行填充,数据更加合理
from scipy.interpolate import lagrange

# sale = pd.read_excel("./catering_sale.xls") # 日期数据  销量数据 200行*2列
sale["销量"][(sale["销量"] < 400 | (sale["销量"]) > 6000)] = np.NaN


def fill_lagrange(s, n, k=5):
    """
    :param s: 数据                    相当于传过来的sale[i]
    :param n: n这个位置,空数据       相当于穿过来的j
    :param k: 向前5个,向后5个        是在sale[i][j]向前五个数据,向后五个数据,因为是取中值
    :return:
    """
    x = s[list(range(n - k, n)) + list(range(n + 1, n + 1 + k))]  # 列表中的数据s[[0,1,2,3,4]+[6,7,8,9,10]] 取出数据
    x = x[x.notnull()]  # 删除y里面可能包含的空值  # 这是一个条件,根据这个条件bool值为True取到数据给到w
    w = list(x)
    # 第一个参数,是前后10个数据的index,w是前后10个数据对应的值,返回一个列表,用[n]拿出列表中的数据(中值法自动生成了一个n对应的值)
    return lagrange(x.index, w)[n]


for i in sale.columns:
    # 遍历列索引
    for j in range(sale[i].size):
        # sale[i].size 该列行的长度  j为行索引
        if sale[i].isnull()[j]:
            # 如果该列的j行为空   注意:isnull()[j] 这是j行为空
            # 定义一个方法,使用拉格朗日填充 sale[i]这一列 j这一行
            sale[i][j] = fill_lagrange(sale[i], j)

pyplot.show()

start = time.perf_counter()
# print(df)
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")

第五部分

import matplotlib.pyplot as plt
from matplotlib import pyplot
import numpy as np
import time

# 彩色图片变成黑白图像,三维变成二维,降维处理
# 通过数据聚合操作,axis=-1
img = plt.imread("./bizhi.jpg")
# plt.imshow(img)
gray = img.min(axis=-1)
# plt.imshow(gray, cmap=plt.cm.gray)


# 加权平均数  红0.299  绿0.587  蓝0.114
w = np.array([0.299, 0.587, 0.114])
gray2 = img.dot(w)
plt.imshow(gray2, cmap=plt.cm.gray)  # 图片看上去更加的柔和了

pyplot.show()
start = time.perf_counter()
# print(df)
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")

第六部分

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
from matplotlib import pyplot
import time

# 基础的matplotlib绘图
# 只含单一或两条曲线的图
x = np.linspace(0, 2 * np.pi)  # linspace默认划分50份
y = np.sin(x)
y2 = np.cos(x)
# plt.plot(x, y)
# plt.plot(x, y2)

# 可以在plot函数中传入多对x,y值,在一个图中绘制多个曲线
# plt.plot(x, y, x, y2)
# plt.plot(y, "*")    # markers就是线条的形状,可以是*也可以是o等等,只划marker
# plt.plot(y, marker="*")  # 既划线,又划marker

# 网格线
# plt.plot(x, y, "o")
# plt.grid()  # 添加网格 lw代表linewidth,线的粗细,alpha线的明暗程度,color颜色

# 在一行当中绘制多个图表
# plt.figure(figsize=(9, 6))
# ax = plt.subplot(1, 3, 1)  # 1行3列中的第一个 子图对象
# ax.plot(x, y)
# ax.grid()
#
# ax = plt.subplot(1, 3, 2)  # 1行3列中的第一个 子图对象
# ax.plot(x, y)
# ax.grid(color="red", alpha=0.2)
#
# ax = plt.subplot(1, 3, 3)  # 1行3列中的第一个 子图对象
# ax.plot(x, y)
# ax.grid(color="green", linestyle="--")

# 坐标轴界限 axis()
# 如果axis方法没有任何参数,则返回当前坐标轴的上下限axis(xmin=.ymax=)
# plt.plot(x, y)
# plt.axis([-2, 8, -1, 1])

# 更改线条的颜色
# 方式一
# line = plt.plot(x, y)  # 返回一个列表
# line[0].set_color("red")  # 取出列表中的线条数据,设置该线条数据的颜色
# 方式二   返回值是一个列表,列表后面加一个逗号就成了一个对象,给这个对象设置颜色
# line, = plt.plot(x, y)
# line.set_color("green")

# 画一个圆形
angle = np.linspace(0, 2 * np.pi, 200)
# x = np.sin(angle)
# y = np.cos(angle)
# plt.figure(figsize=(5, 5))  # 不设置为椭圆图;设置为圆形,方式一:设置为圆形图
# plt.plot(x, y)  # 圆就是一个正弦值和一个余弦值,在360度范围内画出来就是一个圆
# plt.axis([-1.3, 1.3, -1, 1])  # 不设置为椭圆图,方式二:设置为圆形图
# plt.axis("equal")  # 设置为圆形,方式二:设置刻度相等
# plt.axis("off")  # 关闭坐标,只显示图形

# plt.xlim([-1.3, 1.3])  # 设置为圆形,方式三:用xlim和ylim
# plt.ylim([-1, 1])

# 全局的字体设置
from matplotlib import rcParams

# 下面这两个是常用属性
rcParams["font.sans-serif"] = "KaiTi"  # 楷体  FangSong仿宋
rcParams["axes.unicode_minus"] = False  # 让负数 - 这个符号可以正常显示

# 在有中文输出的地方,增加一个属性:fontproperties.
# 这种方法能有效的在特定需要输入中文地方确定中文的字体和字号。

# 设置坐标轴标签 xlabel() ylabel()
# plt.ylabel("y=x^2+5",rotation=60)旋转
# plt.plot(x, y)
# plt.axis("equal")
# plt.xlabel("X", fontsize=20, color="red")
# plt.ylabel("x**2 + y**2 = 1", fontsize=20, color="green", rotation=90)
# plt.title("Cicle圆")

# 图例 legend()方法
# 两种传参方法: 推荐使用在plot函数中增加label参数
#                在legend()方法中传入字符串列表
# plt.plot(x, y, x, y2)
# loc默认为0,图表中哪个空位置大,它就自动把图例放到那个位置
# 当loc的值 为元组时,可以输入百分比坐标,注意是当前坐标的轴的百分比的位置
# ncol的值控制图例显示几列,默认一列,竖着显示图例
# plt.legend(["正弦波", "余弦波"], loc=0)
# plt.legend(["正弦波", "余弦波"], loc=(0.3, 0.2), ncol=2)

# 画图的时候,多参数控制线条的属性
# plt.plot(x, y, color="red", marker="o", linestyle="-.")
# 保存绘制的图片
# dpi 图片的分辨率,默认为100
# facecolor设置背景颜色 不包括图标内部
# 如果需要图标内部也有颜色,需要使用子图
ax = plt.subplot(1, 1, 1, facecolor="blue")
ax.plot(x, y2, color="red", marker="o", linestyle="-.")
plt.savefig("./fig.jpg", dpi=600, facecolor="green")

# a = np.arange(10)
# plt.plot(a, a * 1.5, a, a * 2.5, a, a * 3.5, a, a * 4.5)  # 绘制多条曲线时,x,y需要同时填写


plt.show()

start = time.perf_counter()
print()
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")

发布了30 篇原创文章 · 获赞 5 · 访问量 3320

猜你喜欢

转载自blog.csdn.net/Python_DJ/article/details/104354682
今日推荐