美文网首页
拷贝、保存、画图

拷贝、保存、画图

作者: 奶油裙子 | 来源:发表于2023-03-22 10:35 被阅读0次

    一、拷贝

    1、赋值

    简单的赋值不会创建数组对象的副本。相反,它使用原始数组的相同id()来访问它。id()返
    回Python对象的通用标识符,类似于C中的指针。
    一个数组的任何变化都反映在另一个数组上。例如,一个数组的形状改变也会改变另一数组的形状。

    x = np.array([1,2,3,4,5,6])
    print("x数组:")
    print(x)
    print(id(x))
    y = x
    print(y)
    print(id(y))
    y.shape = (3,2)
    print(y)
    print(x)
    

    运行结果:
    x数组:
    [1 2 3 4 5 6]
    1407004506224
    [1 2 3 4 5 6]
    1407004506224
    [[1 2]
    [3 4]
    [5 6]]
    [[1 2]
    [3 4]
    [5 6]]

    2、视图

    视图又可称为浅拷贝,是数据的一个别称或引用,通过该别称或引用亦便可访问,操作原有数据,但原有数据不会产生拷贝。对视图进行修改,它会影响到原始数据,物理内存在同一位置。
    发生情况:

    (1)numpy 的切片操作返回原数据的视图,修改数据会影响到原始数组。
    x = np.arange(12)
    print("x数组:")
    print(x)
    y = x[3:]
    print(y)
    

    运行结果:
    x数组:
    [ 0 1 2 3 4 5 6 7 8 9 10 11]
    [ 3 4 5 6 7 8 9 10 11]

    y[1] = 400
    print(y)
    print(x)
    print(id(x))
    print(id(y))
    

    运行结果:
    [ 3 400 5 6 7 8 9 10 11]
    [ 0 1 2 3 400 5 6 7 8 9 10 11]
    1407031118032
    1407031118608

    (2)调用ndarray的view()函数产生一个视图

    创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数

    x = np.arange(6).reshape((3,2))
    print("x数组:")
    print(x)
    y = x.view()
    print(y)
    y[1][0] = 200
    print(y)
    print(x)
    y.shape = (2,3)
    print(y)
    print(x)
    

    运行结果:
    x数组:
    [[0 1]
    [2 3]
    [4 5]]
    [[0 1]
    [2 3]
    [4 5]]
    [[ 0 1]
    [200 3]
    [ 4 5]]
    [[ 0 1]
    [200 3]
    [ 4 5]]
    [[ 0 1 200]
    [ 3 4 5]]
    [[ 0 1]
    [200 3]
    [ 4 5]]

    3、副本

    副本又可称为深拷贝,是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置
    发生情况:

    (1)调用ndarray 的copy()函数产生一个副本

    作用:创建一个副本
    说明:对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置

    x = np.array([[10,10],[2,3],[4,5]])
    print("x数组:")
    print(x)
    y = x.copy()
    print(y)
    y[0][0] = 100
    print(y)
    print(x)
    

    x数组:
    [[10 10]
    [ 2 3]
    [ 4 5]]
    [[10 10]
    [ 2 3]
    [ 4 5]]
    [[100 10]
    [ 2 3]
    [ 4 5]]
    [[10 10]
    [ 2 3]
    [ 4 5]]

    (2)python序列的切片操作,调用deepCopy()函数

    二、IO函数

    numpy 可以读写磁盘上的文本数据或二进制数据
    numpy 为ndarray 对象引入了一个简单的文件格式:npy
    npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息

    常用IO函数 作用
    load()和save() 是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy 的文件中
    savez() 用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中
    loadtxt()和savetxt() 处理正常的文本文件(.txt 等)
    (1)numpy.save()

    原型:numpy.save(file,arr,allow_pickle=True,fix_imports=True)
    作用:将数组保存到以.npy 为扩展名的文件中

    參数 说明
    file 要保存的文件,扩展名为.npy,如果文件路径末尾没有扩展名.npy,该扩展名会被自动加上
    arr 要保存的数组
    allow_pickle 可选,布尔值,允许使用 python pickles 保存对象数组,Python的pickle用于在保存到磁盛文件或从磁盘文件读取之前,对对系进行序列化和反序列化
    fix_imports 可选,为了方便 Pyhton2 中读取 python3 保存的数据
    x = np.array([[10,10],[2,3],[4,5]])
    print("x数组:")
    print(x)
    

    运行结果:
    x数组:
    [[10 10]
    [ 2 3]
    [ 4 5]]

    np.save("./outfile.npy",x)
    y = np.load("./outfile.npy")
    print(y)
    

    运行结果:
    [[10 10]
    [ 2 3]
    [ 4 5]]

    (2)numpy.savez()

    原型: numpy.savez(file,*args,**kwds)
    作用:将多个数组保存到以 npz 为扩展名的文件中

    參数 说明
    file 要保存的文件,扩展名为 npz,如果文件路径未尾没有扩展名.npz,该扩展名会被自动加上
    args 要保存的数组,可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为 arr_0,arr_1,...
    kwds 要保存的数组使用关键字名称
    x = np.array([1, 2, 3])
    y = np.array([4, 5, 6])
    z = np.array([7, 8, 9])
    np.savez("outfile.npz", x, y, sin_arr=z)
    
    ret = np.load("./outfile.npz")
    print(ret)
    

    运行结果:
    <numpy.lib.npyio.NpzFile object at 0x0000014799E1A790>

    print(ret["arr_0"])
    

    运行结果:
    [1 2 3]

    (3)numpy.savetxt()

    原型:
    numpy.savetxt(FILENAME, a, fmt="%d", delimiter=",")
    numpy.loadtxt (FILENAME, dtype=int, delimiter=",")
    作用:以简单的文本文件格式存储数据,对应的使用 loadtxt()函数来获取数据

    参数 说明
    delimiter 指定各种分隔符、针对特定列的转换器函数、需要跳过的行数等
    x = np.array([1,2,3])
    print(x)
    np.savetxt("out2.txt",x,fmt="%d",delimiter=",")
    y = np.loadtxt("out2.txt")
    print(y)
    

    运行结果:
    [1 2 3]
    [1. 2. 3.]

    三、matplotlib

    1、matplotlib简介

    Matplotlib最初由John D. Hunter于2003编写;
    Matplotlib是用于数据可视化的最流行的Python包之一;
    它是一个跨平台库,用于根据数组中的数据制作2D图;
    Matplotlib是用Python编写的,井使用了Python的数值数学扩展NumPy;
    它提供了一个面向对象的API,有助于使用Python GUI工具包(如pyQt,WxPythonotTkinter)在应用程序中嵌入绘图;
    它也可以用于Python和IPython shell,Jupyter笔记本和Web应用程序服务器;
    Matplotlib和NumPy可以被认为是MATLAB的开源等价物;
    pillow可以使用的唯一数据类型是uint8。

    2、pyplot的API

    matplotlib.pyplot是命令样式函数的集合,使Matplotlib像MATLAB一样工作。每个Pyplot
    功能都会对图形进行一些更改。例如,函数创建一个图形,一个图形中的绘图区域,绘制绘
    图区域中的一些线条,用标签装饰图形等。

    绘制(图表)类型
    函数 描述
    Bar 绘制条形园(柱状图)
    Barh 绘制水平条形图
    Boxplot 绘制一个箱形和须图
    Hist 绘制直方图
    hist2d 绘作2D直方图
    Pie 绘制饼图
    Plot 绘制轴的线和/或标记
    Polar 绘制一个极坐标图
    Scatter 绘制x与y的散点图
    Stackplot 绘制堆积区域图
    Stem 绘制杆图
    Step 绘制步骤图
    Quiver 绘制二维箭头字段
    图像函数
    函数 描述
    Imread 将文件中的图像读入数组
    Imsave 像在图像文件中一样保存数组
    Imshow 在轴上显示图像
    轴函数
    函数 描述
    Axes 添加轴到图形
    Text 向轴添加文本
    Title 设置当前轴的标题
    Xlabel 设置当前轴的x轴标签
    Xlim 获取或设置当前轴的x限制
    Xscale 设置x轴的缩放比例
    Xticks 获取或设置当前刻度位置和标签的x限制
    Ylabel 设置当前轴的y轴标签
    Ylim 获取或设置当前轴的y限制
    Yscale 设置y轴的缩放比例
    Yticks 获取或设置当前刻度线位置和标签的y限制
    图形函数
    函数 描述
    Figtext 将文字添加到图形
    Figure 创建一个新的图形
    Show 显示一个图形
    Savefig 保存当前图形
    Close 关闭一个图窗口

    3、pylab模块

    Matplotlib是整个包,matplotlib.pyplot是Matplotlib中的一个模块,它和PyLab是一个与
    Matplotlib一起安装的模块。pyLab是Matplotlib面向对象绘图库的过程接口,是个非常方便模块,可以在单个名称空间中批量导入matplotlib.pyplot(用于绘图)和NumPy(用于数学和使用数组)。虽然有许多示例使用PyLab,但不再推荐使用它。

    import numpy as np
    import pylab as plb
    
    x = np.linspace(-3,3,30)
    y = x**2
    
    plb.plot(x,y)
    plb.show()
    
    运行结果:
    线的颜色与样式

    颜色:b,g,r,c,m,y,k,w
    符号:^,v,<,>,s,+,x,D,d,1,2,3,4,h,H,p,|,_,-,--,-.,.,,,o

    plb.plot(x,y,"b1")
    plb.show()
    
    x = np.linspace(-3,3,30)
    plb.plot(x,np.sin(x))
    plb.plot(x,np.cos(x),"r--")
    plb.plot(x,-np.sin(x),"g--")
    
    plb.show()
    
    运行结果:
    plb.clf()  #关闭图形
    

    4.简单画图

    显示一个简单的角度线图,以弧度为单位,与正弦值相对应
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from IPython.core.interactiveshell import InteractiveShell
    import openpyxl
    InteractiveShell.ast_node_interactivity = "all"
    pd.options.display.max_columns=1000
    pd.options.display.max_rows=30
    pd.set_option('display.float_format', lambda x: '%5f' % x)
    %matplotlib inline
    plt.rcParams['font.sans-serif'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    %config Inlinebackend.config_format = 'svg'
    x = np.arange(0,math.pi*2,0.05)
    y = np.sin(x)
    
    plt.plot(x,y)
    plt.title("正弦波")
    plt.xlabel("角度", color = "r", fontsize = 20)
    plt.ylabel("正弦",  color = "b", rotation = 60)
    
    运行结果:

    5、使用面向对象的思想画图

    虽然使用matplotlib.pyplot模块很容易快速生成绘图,但建议使用面向对象的方法,因为它
    可以更好地控制和自定义绘图,并且matplotlib.axes.Axes类中也提供了大多数函数。
    使用更正式的面向对象方法背后的主要思想是创建图形对象,然后只调用该对象的方法或属
    性,这种方法有助于更好地处理其上有多个绘图的画布。
    在面向对象的界面中,pyplot仅用于一些功能,如图形创建,用户显式创建和跟踪图形和轴
    对象。在此级别,用户使用pyplot创建图形,通过这些图形可以创建一个或多个轴对象。然后,这些轴对象用于大多数绘图操作。

    (1)Figure类(相当于画画需要纸)

    matplotlib.figure模块包含Figure类,它是所有plot元素的顶级容器,通过从pyplot模块调用figure0函数来实例化Figure对象。

    fig = plt.figure()
    print(fig)
    

    运行结果:
    Figure(640x480)
    <Figure size 640x480 with 0 Axes>

    (2)Axes类

    Axes对象是具有数据空间的图像区域。给定的图形可以包含许多轴,但给定的Axes对象只能在一个图中。轴包含两个(或在3D情况下为三个)Axes对象。Axes类及其成员函数是使用OO接口的主要入口点。
    figure对象通过调用add_axes()方法将Axes对象添加到图中。它返回轴对象并在位置
    rect[left, bottom,width,height]添加一个轴,其中所有数量都是图形宽度和高度的分数。
    add_axes0的参数是4个长度序列的[左,底,宽,高]数量。轴类的以下成员函数为图添加
    了不同的元素。

    fig = plt.figure()
    ax = fig.add_axes([0,0,1,1])
    print(ax)
    
    (3)ax.legend()

    作用:为绘图图形添加了一个图例
    原型:
    legend()
    legend(labels)
    legend (handles, labels)
    legend (handles, labels, loc)

    参数 说明
    labels 描述
    loc 位置
    loc位置描述 位置代码
    best 0
    upper right 1
    upper light 2
    lower left 3
    lower right 4
    right 5
    center left 6
    center right 7
    lower center 8
    upper center 9
    center 10
    (4)ax.plot(

    作用:这是轴类的基本方法,它将一个数组的值与另一个数组的值绘制为线或标记
    原型:
    ax.plot(args, scalex=True,scaley=True, data=None,kwargs)
    ax.plot([x], y, [fmt],
    ,data=None,kwargs)
    ax.plot([x], y, [fmt], [x2], y2, [fmt2],
    kwargs)

    fmt颜色代码字符标记 颜色
    b Blue
    g Green
    r Red
    c Cyan
    m Magenta
    y Yellow
    k Black
    w White
    fmt标记代码字符标记 描述
    . 点标记
    , 像素
    o 圆形
    v 朝下的三角形
    ^ 朝上的三角形
    < 朝左的三角形
    > 朝右的三角形
    s 正方形
    p 五角形
    * 星型
    h 1号三角形
    H 2号三角形
    + +号标记
    D 钻石形
    d 小版钻石形
    垂直线形
    _ 水平线形
    fmt线条样式字符 描述
    - 实线
    -- 虚线
    -. 单化线
    : 点虚线
    更多属性 说明
    color 颜色
    alpha 透明度
    linestyle或ls 线型
    linewidth或lw 线宽
    marker 点类型
    markersize 点大小
    markeredgewidth 点边缘的宽度
    markeredgecolor 点边缘的颜色
    markerfacecolor 点内部的颜色
    x = [1,16,30,42,55,68,77,88]
    y = [1,4,9,16,25,36,49,64]
    
    fig = plt.figure(figsize=(10,5))
    ax = fig.add_axes([0,0,1,1])
    
    ax.plot(x,y,"r--",marker = "d" ,markersize = 10,markeredgewidth = 5 ,markeredgecolor = "green")
    
    运行结果:
    (5)axes和figure对象的关系
    <1>什么是figure?

    figure的翻译是图像,这个谁都知道,但是在matlab中的figure对象准确意义应该是:
    matlab软件用于直观性圈形输出的窗口个体,这个概念很多人没有

    <2>什么是axes?

    一张白纸上可以画画,你可以在纸上的任何区域画,这个确定画图区域并确定作图的
    些方式的东西的就是axes,也就是坐标对象。画图的作用就是,在当前的活动figure对
    象中的一个坐标对象上作图

    <3>axes与figure

    一张白纸上可以面在几个区域内面图,而所谓区域,必须存在于白纸上才有意义。
    figure 上可以有多个axes,axes必须在igure上,要画图必须有axes。

    <4>关于句柄

    axes和figure的对象属性能让用户方便的进行操作,例如在figure上选中一个axes:
    set(figure_handle,'CurrentAxes',axes handle)

    <5>图解

    Figure
    图是层次结构中级别最高的对象。它对应于整个图形表示,通常可以包含多个轴。
    Axes
    坐标轴通常就是你所说的图或图表。每个轴对象只属于一个图形,并由两个轴(在三维情况下为三个)表示。还有其他对象,如标题、x标签稍y标签都属于这个组合。
    Axis
    Axis对象考虑要在轴上表示的数值,定义限制,并管理刻度(轴上的标记)和刻度标签(每个刻度上表示的标签文本)。标记的位置由名为Locator的对象调整,而格式化标记标签则由名为Formatter的对象调整。

    6、画布上创建多个子图

    (1)subplot()

    原型:plt.subplot (nrows,ncols, index)
    作用:返回给定网格位置的axes对象
    说明:
    1、 在当前图中,该函数创建并返回一个Axes对象,在ncolsaxes的nrows网格的位置素引处。索引从1到nrows * ncols, 以行主顺序递增。如果nrows, ncols和index都小于10。索引也可以作为单个,连接,三个数字给出。
    2、例如,subplot(2,3,3)和subplot(233)都在当前图形的右上角创建一个轴,占据图形高度的一半和图形宽度的三分之一。
    3、 创建子图将删除任何与其重叠的预先存在的子图,而不是共享边界。

    fig = plt.figure(figsize=(12,6))
    
    ax1 = plt.subplot(2,1,1)
    ax1.plot(range(12))
    
    ax2 = plt.subplot(212,facecolor = 'y')
    ax2.plot(range(12))
    
    plt.show()
    
    运行结果:
    (2)subplots()

    原型:plt.subplots (nrows, ncols)
    作用:它充当实用程序包装器,并在单个调用中帮助创建子图的公共布局,包括封闭的图形对象。该函数返回一个图形对象和一个包含等于nrows * ncols的轴对象的元组,每个轴对象都可通过索引访问。
    参数:此函数的两个整数参数指定子图网格的行数和列数

    fig,axList = plt.subplots(2,2)
    x =np.arange(1,5)
    
    axList[0][0].plot(x,x*x)
    axList[1][0].plot(x,np.exp(x))
    axList[0][1].plot(x,np.sqrt(x))
    axList[1][1].plot(x,np.log10(x))
    
    plt.show()
    
    运行结果:
    (3)subplot2grid()

    特点:在网格的特定位置创建轴对象提供了更大的灵活性,还允许轴对象跨越多个行或列。

    axl = plt.subplot2grid((3, 3), (0, 0), colspan=2, rowspan=1)
    ax2 = plt.subplot2grid((3, 3), (0, 2), colspan=1, rowspan=3)
    ax3 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=2)
    
    x = np.arange(1, 10)
    
    ax1.plot(x, np.exp(x))
    ax1.set_title("square root")
    
    ax3.plot(x, np.log(x))
    ax3.set_title("log")
    
    ax2.plot(x, x * x)
    ax2.set_title("square")
    
    plt.show()
    
    运行结果:
    (4)通过在同一图形画布中添加另一个轴对象来在同一图中添加插入图。
    fig = plt.figure()
    
    x = np.arange(0,math.pi*2,0.05)
    
    ax1 = fig.add_axes([0,0,1,1])
    ax1.plot(x,np.sin(x))
    ax1.set_title("sin")
    
    ax2 = fig.add_axes([0.55,0.55,0.3,0.3])
    ax2.plot(x,np.cos(x))
    ax2.set_title("cos")
    
    plt.show()
    
    运行结果:
    (5)figure类的add_subplot()函数
    fig = plt.figure()
    
    x = np.arange(0,math.pi*2,0.05)
    
    ax1 = fig.add_subplot(111)
    ax1.plot(x,np.sin(x))
    
    ax2 = fig.add_subplot(222,facecolor='r')
    ax2.plot(x,np.cos(x),'b')
    
    plt.show()
    
    运行结果:

    7、网格

    axes对象的grid()函数将图中网格的可见性设置为on或off。还可以显示网格的主要/次要(或
    两者)刻度,还可以在grid()函数中设置color, linestyle和linewidth属性

    fig, axes = plt.subplots(1, 3, figsize=(12, 4))
    
    x = np.arange(1, 11)
    
    axes[0].plot(x, x * x)
    axes[0].grid(True)
    
    axes[1].plot(x, x * x)
    axes[1].grid(color='r', ls='--', lw=0.3)
    
    axes[2].plot(x, x * x)
    
    plt.show()
    
    运行结果:

    相关文章

      网友评论

          本文标题:拷贝、保存、画图

          本文链接:https://www.haomeiwen.com/subject/hqhprdtx.html