python库相关整理
NumPy
NumPy是科学计算的基础包之一.通常导入包的操作即NumPy的推荐惯例如下.
1 | import numpy as np |
ndarray即dtype指示数组元素类型,ndim指示数组的维度,shape用元组的形式表示各维度的大小.np.array是最常见的创建数组的操作,通常代码为如下形式.
1 | arr = np.array([0, 1, 2, 3, 4]) |
数组提供了高速数值操作的节省内存的容器,测量设备记录的信号、图像的像素等数据都可以作为数组.
dtype是NumPy能灵活处理其他外界数据的原因,常见的类型有np.int32和np.float64.可使用astype创建一个转换类型后的数组拷贝,代码如下.
1 | arr = arr.astype(np.float64) |
矢量化(Vectorization)即不需要编写循环就能对ndarray的元素执行批量运算,大小相等的ndarray间的任何算术运算都会将运算应用至元素级(Elementwise),ndarray与标量的算术运算也会为各元素执行标量运算.常见的数学函数np.sin、np.log和np.exp等也是元素级的运算.即使ndarray的形状不同,仍然可以通过广播(Broadcasting)机制来执行元素级操作,即通过适当复制元素来扩展数组, 以便在转换之后,两个ndarray具有相同的形状.
可将多个ndarray连结(Concatenate)在一起,需要给出沿着连结的轴,代码如下.
1 | arr = np.concatenate([arr1, arr2], axis=0) |
np.vstack和np.hstack方法将ndarray分别按垂直、水平的方向叠加.
ndarray的切片是原始数组的视图,即访问数组数据的一种方式,因此数据不会被复制,任何对切片的修改都会反应到原数组上.如果想得到ndarray切片的拷贝而非视图,需要对切片进行显式的复制操作即copy().可以使用np.may_share_memory()确认两个数组是否共享相同的内存块.
访问矩阵的T属性即转置变换,需要注意转置变换是视图的形式.
运行一些操作可能会导致为新结果分配内存.例如形如arr2 = arr1 + arr2的操作将取消引用arr2指向的ndarray,而是指向新分配的内存处的ndarray.若需要减少内存开销,可使用形如arr2[:] = arr1 + arr2或arr2 += arr1的操作.
高维数组的索引访问有两种常见的等价方式,以二维数组为例,arr[i][j]和arr[i, j]获取元素的方式是等价的.
花式索引(Fancy Indexing)的内容如下.
- 布尔型索引(Boolean Indexing):又称掩码(Mask),即作用于索引的布尔型数组,布尔型数组通常由
ndarray的比较运算==、>或<产生,或由对布尔型数组的逻辑操作np.logical_or和np.logical_and产生,其中比较运算==也是矢量化的(注意数组级别的相等比较使用np.array_equal方法),因此组合多个布尔条件意味着对布尔型数组执行&、|等运算,而使用关键字and、or等是非法的; - 整型索引(Integer Indexing):使用整数列表或数组进行索引,以通过指定顺序选取子集.
若要将大小为1的ndarray转换为标量,可以调用ndarray的item()或python的内置函数float().
ndarray的mean、sum、min和max可以分别计算数组元素的均值、总和、最小值和最大值,argmin和argmax分别获得数组元素最小值的索引和最大值的索引,all和any返回布尔型数组任意为真和任一为真的情况,而可选参数axis可控制操作轴即计算的方向.
ndarray的ravel方法可将高维数组扁平化,而reshape方法可以重新规划数组形状,transpose方法可进行维度重组.
Sympy
Sympy是符号计算库.通常导入包的操作如下.
1 | import sympy as smp |
定义符号变量的操作如下.
1 | x = smp.symbols('x') |
smp.Rational(p, q)可以创建分数
smp.factor可以对多项式进行因式分解,smp.expand可以将表达式展开,smp.simplify可以对表达式进行化简.
smp.solve(f, x)可以求解方程expr.subs([(x, x1), (y, y1)])可以对表达式的变量
求
1 | smp.limit(smp.sin(x), x, smp.pi) |
定义函数smp.diff求
1 | f, g = smp.symbols('f g', cls=smp.Function) |
代入doit()方法.
1 | dfdx = smp.diff(f, x) |
Matplotlib
Matplotlib是常用的科学绘图库,将数据及各种分析可视化.通常导入包的操作如下.
1 | import matplotlib as mpl |
下述操作保证Matplotlib绘制的图像可在Jupyter Notebook中正确显示.
1 | %matplotlib inline |
简单地绘制正弦函数的操作如下.
1 | x = np.linspace(-np.pi, np.pi, num) |
Matplotlib在mpl.figure.Figure上通过数据绘制图像,每个图像包含一个或多个mpl.axes.Axes,即可以通过坐标轴绘制图像的区域,其中Figure跟踪所有的子Axes.使用plt.subplots方法是最简单的创建图形的操作,如下例.
1 | fig, ax = plt.subplots(nrows, ncols) |
基本上有如下两种使用Matplotlib绘图的方法:通过plt自动创建、管理和绘制图像;显式创建图像,并以调用子Axes的方法的形式管理和绘制图像.xlim和ylim方法分别设置坐标轴横轴和纵轴的极值,axis方法接受一个形如[xmin, xmax, ymin, ymax]的列表以直接设置坐标轴的极值,xticks和yticks方法分别设置坐标轴横轴和纵轴需要显示的刻度值,set_xlabel和set_ylabel方法分别设置坐标轴横轴和纵轴的标签.
set_title方法设置图像的标题.直接调用legend方法可以显示图像的图例,可选参数loc可以指定图例的位置,图例的信息可以通过plot方法的可选参数label设置.
Pandas
Pandas常用于处理和分析数据.通常导入包的操作如下.
1 | import pandas as pd |
散点图矩阵(Pair Plot)可以两两查看所有的特征,矩阵的对角线是每个特征的直方图,适用于特征数不多的情况,但无法同时显示所有特征之间的关系.绘制散点图矩阵的代码如下.
1 | pd.plotting.scatter_matrix(pd.DataFrame(X), c=y) |
若散点图矩阵显示特征数据能基本将类别区分开,说明机器学习模型很可能具有好的学习效果.
OpenCV
通常导入包的操作如下.
1 | import cv2 |
读取图片的操作如下.
其中,
path为图像的路径,需注意即使路径错误也不会提示出错.
1 | img = cv2.imread(path) |
imread()的第二个参数可省略,内容如下.
cv2.IMREAD_COLOR:读入彩色图像,忽略透明度,是默认参数;cv2.IMREAD_GRAYSCALE:以灰度模式读入图像;cv2.IMREAD_UNCHANGED:读入图像并保留透明度.
于窗口显示图片的操作如下.
其中:
title为显示窗口的标题;waitKey(0)表示无时限地等待键盘输入.
1 | cv2.imshow(title, img) |
调整图像大小的操作如下.
1 | img = cv2.resize(img, (width, height)) |
裁剪图像为由
1 | img = img[y1:y2, x1:x2] |
保存图像的操作如下.
1 | cv2.imwrite(path, img) |
从文件中读取视频的操作如下.
1 | cap = cv2.VideoCapture(path) |
从编号为0的摄像头设备中读取视频的操作如下.
1 | cap = cv2.VideoCapture(0) |
于窗口播放视频的操作如下.
1 | while True: |
转换为灰度图像的操作如下.
1 | img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) |
高斯模糊处理的操作如下.
1 | img_blur = cv2.GaussianBlur(img, (7, 7), 0) |
使用Canny算子进行边缘检测的操作如下,后两个参数是边缘检测的阈值.
1 | img_canny = cv2.Canny(img, 100, 100) |
膨胀的操作如下.
1 | kernel = np.ones((5, 5), np.uint8) |
腐蚀的操作如下.
1 | kernel = np.ones((5, 5), np.uint8) |
cv2.addWeighted()依照如下公式混合两张图像.
1 | img = cv2.addWeighted(img1, alpha, img2, beta, gamma) |