拷贝、保存、画图

2023-03-22  本文已影响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()
运行结果:
上一篇 下一篇

猜你喜欢

热点阅读