拷贝、保存、画图
一、拷贝
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()
运行结果: