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

Maha ·
更新时间:2024-05-17
· 973 次阅读

第一部分 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["销量"] 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)}")
作者:Python 键盘上的舞者



数据 数据分析 scipy 人工智能

需要 登录 后方可回复, 如果你还没有账号请 注册新账号