zoukankan      html  css  js  c++  java
  • Numpy与Matplotlib学习笔记

    Numpy与Matplotlib读书笔记2020-05-06

    一、numpy

    简介

    • numpy 是用于处理含有同种元素的多维数组运算的第三方库;
    • numpy 库还包括三角运算函数、傅里叶变换、随机和概率分布、基本数值统计、位运算、矩阵运算等非常丰富的功能;

    • numpy 库处理的最基础数据类型是由同种元素构成的多维数组(ndarray),简称“数组”;

    • 数组中所有元素的类型必须相同,数组中元素可以用整数索引,序号从0开始。ndarray 类型的维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。一维数组的秩为1,二维数组的秩为2,二维数组相当于由两个一维数组构成;

    • 由于numpy 库中函数较多且命名容易与常用命名混淆,建议采用如下方式引用numpy 库: >>>import numpy as np;

    • 其中,as 保留字与import 一起使用能够改变后续代码中库的命名空间,有助于提高代码可读性。简单说,在程序的后续部分中,np 代替numpy。

    numpy 库常用的创建数组函数

    函数 描述
    np.array([x,y,z],dtype=int) 从Python列表和元祖创造数组
    np.arange(x,y,i) 创建一个由x到y,以i为步长的数组
    np.linspace(x,y,n) 创建一个由x到y,等分成n个元素的数组
    np.indices((m,n)) 创建一个m行n列的矩阵
    np.random.rand(m,n) 创建一个m行n列的随机数组
    np.ones((m,n),dtype) 创建一个m行n列全1的数组,dtype是数据类型
    np.empty((m,n),dtyoe) 创建一个m行n列全0的数组,dtype是数据类型

    numpy 库的算术运算函数

    函数 描述
    np.add(x1,x2[,y]) y=x1+x2
    np.subtract(x1,x2[,y]) y=x1-x2
    np.multiply(x1,x2[,y]) y=x1*x2
    np.divide(x1,x2[,y]) y=x1/x2
    np.floor_divide(x1,x2[,y]) y=x1//x2
    np.negative(x[,y]) y=-x
    np.power(x1,x2[,y]) y=x1**x2
    np.remainder(x1,x2[,y]) y=x1%x2
    • 这些函数中,输出参数y 可选,如果没有指定,将创建并返回一个新的数组保存计算结果;如果指定参数,则将结果保存到参数中。例如,两个数组相加可以简单地写为a+b,而np.add(a,b,a)则表示a+=b。

    numpy 库的比较运算函数

    函数 符号概述
    np.equal(x1,x2[,y]) y=x1==x2
    np.not_equal(x1,x2[,y]) y=x1!=x2
    np.less(x1,x2[,y]) y=x1<x2
    np.less_equal(x1,x2[,y]) y=x1<=x2
    np.greater(x1,x2[,y]) y=x1>x2
    np.greater_equal(x1,x2[,y]) y=x1>=x2
    np.where(condition[x,y]) 根据给出的条件判断输出x还是y
    • 其将返回一个布尔数组,它包含两个数组中对应元素值的比较结果;

    • where()函数是三元表达式x if condition else y 的矢量版本。

    numpy 库的其他运算函数

    函数 描述
    np.abs(x) 计算基于元素的整形,浮点或复数的绝对值
    np.sqrt(x) 计算每个元素的平方根
    np.squre(x) 计算每个元素的平方
    np.sign(x) 计算每个元素的符号:1(+),0,-1(-)
    np.ceil(x) 计算大于或等于每个元素的最小值
    np.floor(x) 计算小于或等于每个元素的最大值
    np.rint(x[,out]) 圆整,取每个元素为最近的整数,保留数据类型
    np.exp(x[,out]) 计算每个元素的指数值
    np.log(x),np.log10(x),np.log2(x) 计算自然对数(e),基于10,2的对数

    二、matplotlib库

    简介 

    • matplotlib 是提供数据绘图功能的第三方库,其pyplot 子库主要用于实现各种数据展示图形的绘制;
    • matplotlib.pyplot 是matplotlib 的子库,引用方式如下: >>>import matplotlib.pyplot as plt;
    • 上述语句与import matplotlib.pyplot 一致,as 保留字与import 一起使用能够改变后续代码中库的命名空间,有助于提高代码可读性。简单说,在后续程序中,plt 将代替matplotlib.pyplot;
    • matplotlib 库由一系列有组织有隶属关系的对象构成,这对于基础绘图操作来说显得过于复杂。因此,matplotlib 提供了一套快捷命令式的绘图接口函数,即pyplot 子模块。pyplot 将绘图所需要的对象构建过程封装在函数中,对用户提供了更加友好的接口。pyplot 模块提供一批预定义的绘图函数,大多数函数可以从函数名辨别它的功能。

    plt 库的绘图区域函数

    plt.figure(figsize=None,facecolor=None) 创建一个全局绘图区域
    plt.axes(rect.axisbg='w') 创建一个坐标系风格的子绘图区域
    plt.subplot(nrows,ncols,plot_number) 在全局绘图区域中创建一个子绘图区域
    plt.subplots_adjust() 调整子绘图区域的布局
    • 使用figure()函数创建一个全局绘图区域,并且使它成为当前的绘图对象,figsize参数可以指定绘图区域的宽度和高度,单位为英寸。鉴于figure()函数参数较多,这里采用指定参数名称的方式输入参数。 >>> plt.figure(figsize=(8,4))
    • subplot()都用于在全局绘图区域内创建子绘图区域,其参数表示将全局绘图区域分成nrows 行和ncols 列,并根据先行后列的计数方式在plot_number 位置生成一个坐标系,实例代码如下,三个参数关系如图10.3 所示。其中,全局绘图区域被风割成3x2 的网格,其中,在第4 个位置绘制了一个坐标系;
    • axes()默认创建一个subplot(111)坐标系,参数rec = [left,bottom,width,height]中四个变量的范围都为[0,1],表示坐标系与全局绘图区域的关系;axisbg 指背景色,默认为white。

    plt 库的读取和显示函数

    函数 描述
    plt.legend() 在绘图区域中方式绘图标签(也称图注)
    plt.show() 显示创建的绘图对象
    plt.matshow() 在窗口显示数组矩阵
    plt.inshow() 在axes上显示图像
    plt.imsave() 保存数组为图像文件
    plt.imread() 从图像文件中读取数组

    plt 库的基础图表函数

    操作 描述
    plt.plot(x,y,label,color,width) 根据x,y数组绘制直/曲线
    plt.boxplot(data,notch,position) 绘制一个箱型图(Box-plot)
    pli.bar(left,height,width,bottom) 绘制一个条形图
    plt.barh(bottom,width,height,left) 绘制一个横向条形图

    plt 库的基础图表函数

    plt.polar(theta,r) 绘制横坐标图
    plt.pie(data.explode) 绘制饼图
    plt.psd(x,NFFT=256,pad_to,Fs) 绘制功率谱密度图
    plt.specgram(x,NFFT=256,pad_to,F) 绘制谱图
    plt.cohere(x,y,NFFT=256,Fs) 绘制X-Y的相关性函数
    plt.scatter() 绘制散点图(x,y长度相同的序列)
    plt.steo(x,y,where) 绘制步阶图
    plt.hist(x,bins,normed) 绘制直方图

    将Python123中作业成绩绘制成雷达图

     1 import numpy as np
     2 import matplotlib.pyplot as plt
     3 
     4 #标签
     5 labels = np.array(['第一周','第二周','第三周','第四周','第五周','第六周'])
     6 #数据个数
     7 dataLenth = 6
     8 #数据
     9 data = np.array([50,100,93,107,110,60])
    10 
    11 angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
    12 data = np.concatenate((data, [data[0]])) # 闭合
    13 angles = np.concatenate((angles, [angles[0]])) # 闭合
    14 
    15 fig = plt.figure()
    16 ax = fig.add_subplot(111, polar=True)# polar参数!!
    17 ax.plot(angles, data, 'bo-', linewidth=2)# 画线
    18 ax.fill(angles, data, facecolor='r', alpha=0.55)# 填充
    19 ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
    20 ax.set_title("马晓嘉(学号:2019310143026)成绩雷达图", va='bottom', fontproperties="SimHei")
    21 ax.set_rlim(0,110)
    22 ax.grid(True)
    23 plt.show()
    View Code

     自定义手绘风

     1 from PIL import Image
     2 import numpy as np
     3 
     4 a = np.asarray(Image.open("d:GEM.jpg").convert('L')).astype('float')
     5 
     6 depth = 10.     #(0-100)
     7 grad = np.gradient(a)       #取图像灰度的梯度值
     8 grad_x, grad_y = grad       #分别取横纵图像的梯度值
     9 grad_x = grad_x*depth/100.
    10 grad_y = grad_y*depth/100.
    11 A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
    12 uni_x = grad_x/A
    13 uni_y = grad_y/A
    14 uni_z = 1./A
    15 
    16 vec_el = np.pi/2.2      # 光源的俯视角度,弧度值
    17 vec_az = np.pi/4.       # 光源的方位角度,弧度值
    18 dx = np.cos(vec_el)*np.cos(vec_az)  #光源对x 轴的影响
    19 dy = np.cos(vec_el)*np.sin(vec_az)  #光源对y 轴的影响
    20 dz = np.sin(vec_el)                 #光源对z 轴的影响
    21 
    22 b = 255*(dx*uni_x + dy*uni_y + dz*uni_z)    #光源归一化
    23 b = b.clip(0,255)
    24 
    25 im = Image.fromarray(b.astype('uint8')) #重构图像
    26 im.save('GEM.jpg')
    27 print("图像手绘化已完成")
    View Code

    这里我用了我偶像GEM邓紫棋的新专辑图片,来看看效果吧!

                     

    使用matplotlib绘制sinx,cosx图像

     1 from matplotlib import pyplot as plt
     2 import numpy as np
     3 plt.figure(figsize=(4,2))#生成的图片的大小
     4 x = np.linspace(-2 * np.pi,2*np.pi,100)#设置一个序列(-2pi,2pi,之间设置100个点)
     5 y = np.sin(x)#需要绘制的函数
     6 y1 = np.cos(x)
     7 
     8 plt.ylim(-1,1)#限制y轴的范围
     9 plt.xlim(-4,4)#x轴的范围
    10 
    11 plt.xlabel("X")
    12 plt.ylabel("Y")
    13 plt.title("sinx cosx ")
    14 plt.plot(x,y,label="sinx")
    15 plt.plot(x,y1,label = "cosx")
    16 plt.text(1,1,"Text",fontdict={'size':16,'color':'r'})
    17 plt.annotate('sin(np.pi)=',xy =(-np.pi,0),xytext=(-np.pi,2),fontsize=16,
    18              arrowprops = dict(facecolor='black',shrink=0.01))#设置注释 
    19 plt.show()
    View Code

         

  • 相关阅读:
    jquery easy ui 1.3.4 窗口,对话框,提示框(5)
    jquery easy ui 1.3.4 布局layout(4)
    4.1 avd
    android sdk 安装排错
    推荐一个非常COOL的开源相册程序!
    JQuery LazyLoad实现图片延迟加载-探究
    Js和asp.net各自设置的cookie相互读取的方法
    js html5推送 实例
    给网页添加[回到顶部]和[去底部]功能
    Session赋值(备注)
  • 原文地址:https://www.cnblogs.com/xugama/p/12837346.html
Copyright © 2011-2022 走看看