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
方法可进行维度重组。
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) |