科学计算库学习笔记
什么是 NumPy?
NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词-- Numerical和Python。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。这类数值计算广泛用于以下任务:
-
机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。
-
图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。
-
数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。
更加详细介绍参见中文官方文档 https://www.numpy.org.cn/index.html,或者英文官方文档 https://www.numpy.org/
Numpy
定义:NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。它主要用于数组计算,包括:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
1、ndarray : ndarray是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。创建一个 ndarray 只需调用 NumPy 的 array 函数即可。
2、参数说明:
| 名称 | 描述 |
| object | 数组或嵌套的数列 |
| dtype | 数组元素的数据类型,可选 |
| copy | 对象是否需要复制,可选 |
| order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
| subok | 默认返回一个与基类型一致的数组 |
| ndmin | 指定生成数组的最小维度 |
实例:
3、数据类型
| 名称 | 描述 |
| bool_ | 布尔型数据类型(True 或者 False) |
| int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
| intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
| int32 | 整数(-2147483648 to 2147483647) |
| uint8 | 无符号整数(0 to 255) |
| float_ | float64 类型的简写 |
| complex_ | complex128 类型的简写,即 128 位复数 |
numpy.dtype(object, align, copy) : object - 要转换为的数据类型对象; align - 如果为 true,填充字段使其类似 C 的结构体; copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用。
实例:

4、数组属性
(1)numpy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。
| 属性 | 说明 |
| ndarray.ndim | 秩,即轴的数量或维度的数量 |
| ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
| ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
| ndarray.dtype | ndarray 对象的元素类型 |
| ndarray.real(imag) | ndarray元素的实(虚)部 |
| ndarray.itemsize | ndarray 对象中每个元素的大小,以字节为单位 |
实例:

5、创建数组
- numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组 numpy.empty(shape, dtype = float, order = 'C')
-
numpy.zeros 创建指定大小的数组,数组元素以 0 来填充 numpy.zeros(shape, dtype = float, order = 'C')
-
numpy.ones 创建指定形状的数组,数组元素以 1 来填充 numpy.ones(shape, dtype = None, order = 'C')

- numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个

- numpy.arange 函数创建数值范围并返回 ndarray 对象 numpy.arange(start, stop, step, dtype) (start:起始值,默认为
0 ;stop:终止值(不包含) step:步长,默认为1; dtype:返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。)

7、切片和索引: slice 函数

8、广播:对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。

什么是 matplotlib ?
Matplotlib是一个Python 2D绘图库,可以生成各种硬拷贝格式和跨平台交互式环境的出版物质量数据。Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包。
Matplotlib试图让简单易事的事情成为可能。你只需几行代码即可生成绘图,直方图,功率谱,条形图,误差图,散点图等。有关示例,请参阅示例图库和缩略图库。
对于简单的绘图,pyplot模块提供类似MATLAB的接口,特别是与IPython结合使用时。 对于高级用户,你可以通过面向对象的界面或通过MATLAB用户熟悉的一组函数完全控制线型,字体属性,轴属性等。
更加详细内容参见中文官方文档 https://www.matplotlib.org.cn/index.html,或英文官方文档 https://matplotlib.org/
1. Matplotlib库的功能
- 用于实现数据可视化功能。
- 可以实现各种图表的绘制、如条形图,散点图,条形图,饼图,堆叠图,3D 图和地图图表。
- Matplotlib库需要单独安装,指令为:
pip install matplotlib。
2. 实现简单的视图
2.1 matplotlib.pyplot
matplotlib.pyplot是一个函数集合,其风格与MATLAB相似。- 基于惯例,我们通常将
matplotlib.pyplot导入为plt
2.2 plt.plot(x,y,format_string, **kwargs)
- 根据坐标绘制图标。
- x,y分表代表x轴、y轴,可以是列表或数组(ndarray)。
- format_string 为控制曲线的格式字符串,由 颜色字符、风格字符和标记字符组成:
| 字符串 | 案例 |
|---|---|
| 颜色字符 | 'b' : 蓝色 '#008000' : RGB颜色 0.8 : 灰度值字符串 |
| 风格字符 | '-' : 实线 '--' : 破折线 '-.' : 点划线 ':' : 虚线 '' : 无线条 |
| 标记字符 | '.' : 点标记 'o' : 实心圈 'v' : 倒三角 '^' : 上三角 |
- **kwargs 表示更多条线的参数。
2.3 plt.show()
- 根据配置和值绘制出视图。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":")
>>>plt.show()

2.4 plt.subplots()
- 返回Figure对象和Axes(数组)对象。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":")
>>>fig,ax = plt.subplots()
>>>print("Figure:",fig)
>>>print("Axes:",ax)
Figure: Figure(432x288)
Axes: AxesSubplot(0.125,0.125;0.775x0.755)
3. 环境配置
3.1 图标
- 在
plt.plot()函数中增加参数label。 - 使用
plt.legend()生成图例。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label sample")
>>>plt.legend() # 生成图例
>>>plt.show()

3.2 标题
- 使用plt.title()添加标题。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label sample")
>>>plt.title('sample title')
>>>plt.legend()
>>>plt.show()

3.3 标签
- 使用
plt.xlabel()和plt.ylabel()为x轴、y轴添加标签。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label sample")
>>>plt.title('sample title')
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

3.4 网格线
- 通过
plt.grid()增加网格线,参数:
| 参数 | 意义 | 值 |
|---|---|---|
| b | 是否显示网格线 | True / False |
| which | 模式 | 'major' / 'minor' / 'both' |
| axis | 绘制哪个方向的网格线 | 'both' / 'x' / 'y' |
| color/c | 颜色 | 各种颜色的首字母 |
| linestyle/ls | 网格线风格 | '-' / '--' / '-. / ':' / 'None' / ' ' |
| linewidth | 网格线宽度 | 数字 |
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label sample")
>>>plt.title('sample title')
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.grid(b=True,which='major',linewidth=0.5)
>>>plt.legend()
>>>plt.show()

3.5 中文显示
- matplotlib需要通过配置
plt.rcParams参数正常显示中文。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":",label="label样式")
>>>plt.rcParams['font.sans-serif']=['SimHei'] # 配置字体
>>>plt.rcParams['axes.unicode_minus']=False # 正常显示符号
>>>plt.title('中文标题')
>>>plt.xlabel('x轴')
>>>plt.ylabel('y轴')
>>>plt.grid(b=True,which='major',linewidth=0.5)
>>>plt.legend()
>>>plt.show()

4. 图标类型
4.1 条形图
- 用
plt.bar()函数绘制条形图。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.bar(x,y,label= 'sample1')
>>>plt.bar(y,x,label= 'sample2',color='g')
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

4.2 直方图
- 用
plt.hist()函数绘制条形图。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>data = np.random.random_integers(100,size=(100))
>>>bins=np.array(range(0,100,10))
>>>plt.hist(data,bins,histtype='bar',rwidth=0.8)
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

4.3 散点图
- 用
plt.scatter()函数绘制散点图。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.scatter(x,y,label='sample',color='b',s=20,marker="o")
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

4.4 堆叠图
- 用
plt.stackplot()函数绘制堆叠图。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>data1 = np.array([1,3,5,7,9])
>>>data2 = np.array([2,4,6,8,10])
>>>data3 = np.array([1,2,3,4,5])
>>>data4 = np.array([6,7,8,9,10])
>>>plt.stackplot(data1,data2,data3,data4,colors=['b','r','m','k'])
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>plt.legend()
>>>plt.show()

4.5 饼图
- 用
plt.pie()函数绘制堆叠图。 explode表示哪些切片需要拉出。autopct表示显示百分比的方式。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>data = np.random.random_integers(100,size=(5))
>>>title=["A","B","C","D","E"]
>>>colours = ['b','r','m','k','c']
>>>plt.pie(data,labels=title,colors=colours,startangle=90,shadow=True,autopct='%1.1f%%',explode=(0.1,0,0,0,0))
>>>plt.legend()
>>>plt.show()

5. 时间戳的使用
- 使用
matplotlib.dates模块将时间戳转换为matplotlib格式。
>>>from datetime import datetime,date,timedelta
>>>import time
>>>import matplotlib.dates as mdates
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>data = np.arange(0,7)
>>>ts_start = datetime(2018,3,30,0,0,0)
>>>ts_now = datetime(2019,3,30,0,0,0)
>>>formatter = mdates.DateFormatter("%Y-%m-%d")
>>>delta = timedelta(5*10^10)
>>>dates = mdates.drange(ts_start,ts_now,delta)
>>>fig,ax = plt.subplots()
>>>plt.plot_date(dates,data)
>>>ax.xaxis.set_major_formatter(formatter)
>>>ax.xaxis.set_tick_params(rotation=30,labelsize=10)
>>>plt.show()

6. 颜色和样式
6.1 改变标签颜色
- 使用axis.label.set_color(color)
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>fig,ax = plt.subplots()
>>>plt.plot(x,y,":",label="label sample")
>>>plt.xlabel('xsample')
>>>plt.ylabel('ysample')
>>>ax.xaxis.label.set_color('b') # 改变x轴label颜色
>>>ax.yaxis.label.set_color('c') # 改变y轴label颜色
>>>plt.title('sample title')
>>>plt.legend()
>>>plt.show()

6.2 填充颜色
- 使用
axis.fill_between(x,y1,y2,where=None,interpolate=False, step=None, *, data=None, **kwargs)填充颜色
| 参数 | 含义 |
|---|---|
| x | 表示覆盖的区域 |
| y1 | 表示覆盖的下限 |
| y2 | 表示覆盖的上限 |
| where | 制定覆盖区域,默认为None |
| interpolate | 是否有重叠区域 |
| step | 步长 |
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.plot(x,y,":")
>>>fig,ax = plt.subplots()
>>>ax.fill_between(x,0,y,facecolor='b',alpha=0.5)
>>>plt.show()

6.3 自定义边框
- 可以使用
axis.spines[position]获得边框,position可以是left,right,top,bottom。 - 通过
axis.spines.set_color(color)改变边框颜色。 - 通过
axis.spines.set_visible(bool)设置是否隐藏边框。 - 通过
axis.spines.set_linewidth(n)设置边框宽度。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>fig,ax = plt.subplots()
>>>ax.spines['top'].set_color('b') # 改变顶部边框的颜色
>>>ax.spines['bottom'].set_visible(False) # 隐藏底部边框
>>>ax.spines['left'].set_linewidth(10) # 改变左侧边框宽度

6.4 自定义刻度
- 可以使用
axis.tick_params(axis, colors)自定义刻度颜色。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>fig,ax = plt.subplots()
>>>ax.tick_params(axis='x', colors='b')
>>>ax.tick_params(axis='y',colors='r')

6.5 添加水平线和垂直线
- 通过
plt.axhline(y, color, linestyle, linewidth)添加水平线。 - 通过
plt.axvline(y, color, linestyle, linewidth)添加垂直线。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
[图片上传中...(下载.png-df23ca-1585644395419-0)]
>>>fig,ax = plt.subplots()
>>>ax.axhline(5, c='b',ls='--', lw=1,)
>>>ax.axvline(5, c='r',ls='-', lw=1,)

6.6 风格美化
- 使用
plt.style.use(style)使用指定的风格。 - 使用
plt.style.available查看所有可以使用的风格。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.style.use('dark_background')
>>>plt.plot(x,y,label="label sample")
>>>plt.show()

7.文本注解
7.1 简单的文本注解
- 使用
text(x, y, s, fontdict=None, **kwargs)添加注解。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.style.use('ggplot')
>>>plt.text(5,7,'text sample',color='b')
>>>plt.plot(x,y,label="label sample")
>>>plt.show()

7.2 带箭头的文本注解
- 使用
annotate(s, xy, *args, **kwargs)添加带箭头的文本注解。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>plt.style.use('ggplot')
>>>plt.annotate('text sample',(5,7),
>>> xytext=(0.6, 0.7), textcoords='axes fraction',
>>> arrowprops = dict(facecolor='red',color='red'),
>>> color='b')
>>>plt.plot(x,y,label="label sample")
>>>plt.show()

7.3 使用框+文本的注解
- 可以通过bbox参数对注解添加边框。
- bbox接受一个dict,包含以下参数:
| 参数 | 含义 |
|---|---|
| boxstyle | 边框的类型 |
| fc | 背景颜色 |
| ec | 边框线的透明度 |
| alpha | 字体的透明度 |
| lw | 线的粗细 |
| rotation | 角度 |
- boxstyle参数包含的类型:
| 类 | 名称 | 基础属性 |
|---|---|---|
| Circle | circle | pad=0.3 |
| DArrow | darrow | pad=0.3 |
| LArrow | larrow | pad=0.3 |
| RArrow | rarrow | pad=0.3 |
| Round | round | pad=0.3,rounding_size=None |
| Round4 | round4 | pad=0.3,rounding_size=None |
| Roundtooth | roundtooth | pad=0.3,tooth_size=None |
| Sawtooth | sawtooth | pad=0.3,tooth_size=None |
| Square | square | pad=0.3 |
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>bbox = dict(boxstyle="larrow",fc='w',ec="r",lw=1)
>>>t = plt.text(7,6,"sample",ha="center",va="center",size=10,bbox=bbox)
>>>plt.plot(x,y,label="label sample")
>>>plt.show()

8. 多图表
8.1 子图
- 使用
plt.subplot(m,n,p)添加子图,实现在一张图表里放多个图表。 - m和n分表代表行和列。
- p代表图标的编号。
- 子图的顺序是从左到右,从上到下。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>#子图1
>>>plt.subplot(2,2,1)
>>>plt.plot(x,y,label="sample1",c='b')
>>>plt.legend()
>>>#子图2
>>>plt.subplot(2,2,2)
>>>plt.plot(x,y,label="sample2",c='r')
>>>plt.legend()
>>>#子图3
>>>plt.subplot(2,2,3)
>>>plt.plot(x,y,label="sample3",c='m')
>>>plt.legend()
>>>#子图4
>>>plt.subplot(2,2,4)
>>>plt.plot(x,y,label="sample4",c='y')
>>>plt.legend()
>>>plt.show()

8.2 跨越网格的子图
- 使用
plt.subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)可以实现在一张图表里放多个跨越网格的图表。 - shape表示大图表的形状。
- loc表示子图的位置。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>#子图1
>>>plt.subplot2grid((4,4),(0,0),colspan=2)
>>>plt.plot(x,y,label="sample1",c='b')
>>>plt.legend()
>>>#子图2
>>>plt.subplot2grid((4,4),(0,3),rowspan=2)
>>>plt.plot(x,y,label="sample2",c='r')
>>>plt.legend()
>>>#子图3
>>>plt.subplot2grid((4,4),(2,1),rowspan=2,colspan=2)
>>>plt.plot(x,y,label="sample3",c='m')
>>>plt.legend()
>>>plt.show()

8.3 共享X轴
- 通过设置属性
sharex参数实现共享x轴。
>>>import matplotlib.pyplot as plt
>>>import numpy as np
>>>x = np.array(range(1,10))
>>>y = np.array(range(10,1,-1))
>>>x1 = np.array(range(1,20))
>>>y1 = np.array(range(20,1,-1))
>>>x2 = np.array(range(1,30))
>>>y2 = np.array(range(30,1,-1))
>>>plt.subplots_adjust(wspace =0, hspace =0)#调整子图间距
>>>#子图1
>>>ax=plt.subplot2grid((3,1),(0,0))
>>>ax.get_xaxis().set_visible(False) # 隐藏x轴
>>>ax.spines['bottom'].set_visible(False) # 隐藏下边框
>>>plt.plot(x,y,label="sample1",c='b')
>>>plt.legend()
>>>#子图2
>>>ax1=plt.subplot2grid((3,1),(1,0),sharex=ax)
>>>ax1.get_xaxis().set_visible(False)# 隐藏x轴
>>>ax1.spines['bottom'].set_visible(False) # 隐藏下边框
>>>ax1.spines['top'].set_visible(False) # 隐藏上边框
>>>plt.plot(x1,y1,label="sample2",c='r')
>>>plt.legend(
