numpy+matplotlib学习

来源:互联网 发布:wordpress windows包 编辑:程序博客网 时间:2024/05/21 21:41

跟着51CTO唐老师的“Tensorflow案例实战视频课程”学习的时候, 发现自己对numpy和matplotlib掌握还很不够, 所以督促自己抽时间整理好资料写篇博客来记录下。

1. numpy

参考:
* NumPy的详细教程
* 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇

1.1 随机模块(random)

随机模块包含了随机数产生统计分布相关的基本函数,Python本身也有随机模块random,不过功能更丰富,还是来看例子:

import numpy as npimport numpy.random as random# 设置随机数种子random.seed(42)# 产生一个1x3,[0,1)之间的浮点型随机数# array([[ 0.37454012,  0.95071431,  0.73199394]])# 后面的例子就不在注释中给出具体结果了random.rand(1, 3)# 产生一个[0,1)之间的浮点型随机数random.random()# 下边4个没有区别,都是按照指定大小产生[0,1)之间的浮点型随机数array,不Pythonic…random.random((3, 3))random.sample((3, 3))random.random_sample((3, 3))random.ranf((3, 3))# 产生10个[1,6)之间的浮点型随机数5*random.random(10) + 1random.uniform(1, 6, 10)# 产生10个[1,6)之间的整型随机数random.randint(1, 6, 10)# 产生2x5的标准正态分布样本random.normal(size=(5, 2))# 产生5个,n=5,p=0.5的二项分布样本random.binomial(n=5, p=0.5, size=5)a = np.arange(10)# 从a中有回放的随机采样7个random.choice(a, 7)# 从a中无回放的随机采样7个random.choice(a, 7, replace=False)# 对a进行乱序并返回一个新的arrayb = random.permutation(a)# 对a进行in-place乱序random.shuffle(a)# 生成一个长度为9的随机bytes序列并作为str返回# '\x96\x9d\xd1?\xe6\x18\xbb\x9a\xec'random.bytes(9)

其中, 已经在ml中遇到过的方法如下表:

方法 说明 等价方式 random.random() 产生一个[0,1)之间的浮点型随机数 random.random((3, 3)) 4个都是按照指定大小产生[0,1)之间的浮点型随机数array random.sample((3, 3))
random.random_sample((3, 3))
random.ranf((3, 3)) random.uniform(1, 6, 10) 产生10[ 1, 6 )之间的浮点型随机数 5*random.random(10) + 1 random.randint(1, 6, 10) 产生10[ 1, 6 )之间的整型随机数 random.normal(size=(5, 2)) 产生2x5的标准正态分布样本, 参数还包括均值,方差


补充: np.random.normal()
参考: http://blog.csdn.net/lanchunhui/article/details/50163669

2. Matplotlib

参考: 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇

Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表。因为其在函数的设计上参考了MATLAB,所以叫做Matplotlib。Matplotlib首次发表于2007年,在开源和社区的推动下,现在在基于Python的各个科学计算领域都得到了广泛应用。Ubuntu16.04上安装使用命令:

pip install matplotlib

常用方法:

import matplotlib.pyplot as pltplt.figure('figure title')# 1. 一个figure, 一张图片或图像"""# 加载并显示一张图片img = plt.imread('001.png')plt.imshow(img)plt.axis('off') # 不显示刻度""""""# 画线: 一组点(x,y) 连成直线或曲线, 万能的plot函数plt.plot(x, y)# '.'标明画散点图,每个散点的形状是个圆plt.plot(x, y_data, '.')# 特别的, plt提供了专门的函数来绘制散点图# scatter可以更容易地生成散点图plt.scatter(x, y_data)"""# 2. 一个figure, 多个 图片或图像"""# 在121位置加入新的图, 也可以写成fig.add_subplot(1, 2, 1)ax1 = fig.add_subplot(121)ax1.set_title('part1')# 在224位置加入新的图ax2 = fig.add_subplot(224)ax2.set_title('part2')# ax绘图, 同plt# ax.plot() ax.pie() ax.imshow() ax.scatter()"""# 最后, 一定要有*, 不然图像不显示fig.show()

2.1 2D图表

Matplotlib中最基础的模块pyplot。先从最简单的点图和线图开始,比如我们有一组数据,还有一个拟合模型,通过下面的代码图来可视化:

import numpy as npimport matplotlib as mplimport matplotlib.pyplot as plt# 通过rcParams设置全局横纵轴字体大小mpl.rcParams['xtick.labelsize'] = 24mpl.rcParams['ytick.labelsize'] = 24np.random.seed(42)# x轴的采样点x = np.linspace(0, 5, 100)# 通过下面曲线加上噪声生成数据,所以拟合模型就用y了……y = 2*np.sin(x) + 0.3*x**2y_data = y + np.random.normal(scale=0.3, size=100)# figure()指定图表名称plt.figure('data')# '.'标明画散点图,每个散点的形状是个圆plt.plot(x, y_data, '.')# 画模型的图,plot函数默认画连线图plt.figure('model')plt.plot(x, y)# 两个图画一起plt.figure('data & model')# 通过'k'指定线的颜色,lw指定线的宽度# 第三个参数除了颜色也可以指定线形,比如'r--'表示红色虚线# 更多属性可以参考官网:http://matplotlib.org/api/pyplot_api.htmlplt.plot(x, y, 'k', lw=3)# scatter可以更容易地生成散点图plt.scatter(x, y_data)# 将当前figure的图保存到文件result.pngplt.savefig('result.png')# 一定要加上这句才能让画好的图显示在屏幕上plt.show()

matplotlib和pyplot的惯用别名分别是mpl和plt,上面代码生成的图像如下:
图一: data
图二: model
图三: data & model

2.2 更多用法

线图表只是最基本的用法,有的时候我们获取了分组数据要做对比,柱状饼状类型的图或许更合适:

import numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltmpl.rcParams['axes.titlesize'] = 20mpl.rcParams['xtick.labelsize'] = 16mpl.rcParams['ytick.labelsize'] = 16mpl.rcParams['axes.labelsize'] = 16mpl.rcParams['xtick.major.size'] = 0mpl.rcParams['ytick.major.size'] = 0# 包含了狗,猫和猎豹的最高奔跑速度,还有对应的可视化颜色speed_map = {    'dog': (48, '#7199cf'),    'cat': (45, '#4fc4aa'),    'cheetah': (120, '#e1a7a2')}# 整体图的标题fig = plt.figure('Bar chart & Pie chart')# 在整张图上加入一个子图,121的意思是在一个1行2列的子图中的第一张ax = fig.add_subplot(121)ax.set_title('Running speed - bar chart')# 生成x轴每个元素的位置xticks = np.arange(3)# 定义柱状图每个柱的宽度bar_width = 0.5# 动物名称animals = speed_map.keys()# 奔跑速度speeds = [x[0] for x in speed_map.values()]# 对应颜色colors = [x[1] for x in speed_map.values()]# 画柱状图,横轴是动物标签的位置,纵轴是速度,定义柱的宽度,同时设置柱的边缘为透明bars = ax.bar(xticks, speeds, width=bar_width, edgecolor='none')# 设置y轴的标题ax.set_ylabel('Speed(km/h)')# x轴每个标签的具体位置,设置为每个柱的中央ax.set_xticks(xticks+bar_width/2)# 设置每个标签的名字ax.set_xticklabels(animals)# 设置x轴的范围ax.set_xlim([bar_width/2-0.5, 3-bar_width/2])# 设置y轴的范围ax.set_ylim([0, 125])# 给每个bar分配指定的颜色for bar, color in zip(bars, colors):    bar.set_color(color)# 在122位置加入新的图ax = fig.add_subplot(122)ax.set_title('Running speed - pie chart')# 生成同时包含名称和速度的标签labels = ['{}\n{} km/h'.format(animal, speed) for animal, speed in zip(animals, speeds)]# 画饼状图,并指定标签和对应颜色ax.pie(speeds, labels=labels, colors=colors)plt.show()

在这段代码中又出现了一个新的东西叫做,一个用ax命名的对象。在Matplotlib中,画图时有两个常用概念,一个是平时画图蹦出的一个窗口,这叫一个figure。Figure相当于一个大的画布,在每个figure中,又可以存在多个子图,这种子图叫做axes。顾名思义,有了横纵轴就是一幅简单的图表。

在上面代码中,先把figure定义成了一个一行两列的大画布,然后通过fig.add_subplot()加入两个新的子图。

subplot的定义格式很有趣,数字的前两位分别定义行数和列数,最后一位定义新加入子图的所处顺序,当然想写明确些也没问题,用逗号分开即可。

原创粉丝点击