NumPy
NumPy 是科学计算的基础包之一。通常导入包的操作即 NumPy 的推荐惯例如下。
ndarray
即维数组 (N-Dimensional Array),是 NumPy 的关键类型。其属性 dtype
指示数组元素类型,ndim
指示数组的维度,shape
用元组的形式表示各维度的大小。np.array
是最常见的创建数组的操作,通常代码为如下形式。
1
| arr = np.array([0, 1, 2, 3, 4])
|
数组提供了高速数值操作的节省内存的容器,测量设备记录的信号、图像的像素等数据都可以作为数组。
创建数组的函数
np.array
将列表、元组等转换为 ndarray
,默认直接复制数据,显式指定或自动推导 dtype
;而 np.asarray
同 array
的区别是,若输入本身是 ndarray
则不进行复制。np.arange
类似内置的 range
但返回 ndarray
;而 np.linspace
通过指定起点、终点和数据点的个数创建数组,在配合 Matplotlib 绘制函数图像时很常用。
np.ones
、np.ones_like
、np.zeros
、np.zeros_like
、np.empty
、np.empty_like
指定形状或根据已知 ndarray
的形状创建全 1、全 0 或未初始化的数组。np.eye
或 np.identity
可创建单位方阵;np.diag
可指定对角线元素创建对角方阵。
np.random.rand
和 np.random.randn
则指定形状创建随机初始化的数组,前者对应均匀分布而后者对应正态分布。
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 2
| import matplotlib as mpl import matplotlib.pyplot as plt
|
下述操作保证 Matplotlib 绘制的图像可在 Jupyter Notebook 中正确显示。
简单地绘制正弦函数的操作如下。
1 2 3 4
| x = np.linspace(-np.pi, np.pi, num) y = np.sin(x) plt.plot(x, y) plt.show()
|
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 常用于处理和分析数据。通常导入包的操作如下。
散点图矩阵 (Pair Plot) 可以两两查看所有的特征,矩阵的对角线是每个特征的直方图,适用于特征数不多的情况,但无法同时显示所有特征之间的关系。绘制散点图矩阵的代码如下。
1
| pd.plotting.scatter_matrix(pd.DataFrame(X), c=y)
|
若散点图矩阵显示特征数据能基本将类别区分开,说明机器学习模型很可能具有好的学习效果。
OpenCV
通常导入包的操作如下。
读取图片的操作如下。
其中,path
为图像的路径,需注意即使路径错误也不会提示出错。
imread()
的第二个参数可省略,内容如下。
cv2.IMREAD_COLOR
:读入彩色图像,忽略透明度,是默认参数;
cv2.IMREAD_GRAYSCALE
:以灰度模式读入图像;
cv2.IMREAD_UNCHANGED
:读入图像并保留透明度。
于窗口显示图片的操作如下。
其中:title
为显示窗口的标题;waitKey(0)
表示无时限地等待键盘输入。
1 2 3
| cv2.imshow(title, img) cv2.waitKey(0) cv2.destroyAllWindows()
|
调整图像大小的操作如下。
1
| img = cv2.resize(img, (width, height))
|
裁剪图像为由和确定的矩形的操作如下。
保存图像的操作如下。
从文件中读取视频的操作如下。
1
| cap = cv2.VideoCapture(path)
|
从编号为 0 的摄像头设备中读取视频的操作如下。
1
| cap = cv2.VideoCapture(0)
|
于窗口播放视频的操作如下。
1 2 3 4 5 6 7 8 9 10 11
| while True: ret, frame = cap.read() if ret == True: cv2.imshow(title, frame) if cv2.waitKey(1) == ord('q'): break else: cv2.waitKey(0) break cap.release() cv2.destroyAllWindows()
|
转换为灰度图像的操作如下。
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 2
| kernel = np.ones((5, 5), np.uint8) img_dialation = cv2.dilate(img_canny, kernel, iterations=1)
|
腐蚀的操作如下。
1 2
| kernel = np.ones((5, 5), np.uint8) img_eroded = cv2.erode(img_canny, kernel, iterations=1)
|
OpenCV 的绘图函数
其中,color
表示使用的颜色,thickness
表示绘笔的粗细程度 (使用 cv2.FILLED
可达到填充的效果)。
绘制由和确定的线段的操作如下。
1
| cv2.line(img, (x1, y1), (x2, y2), color, thickness)
|
绘制由和确定的矩形的操作如下。
1
| cv2.rectangle(img, (x1, y1), (x2, y2), color, thickness)
|
绘制以为圆心、为半径的圆形的操作如下。
1
| cv2.circle(img, (x, y), r, color, thickness)
|
从开始绘制文字的操作如下。
1
| cv2.putText(img, content, (x, y), cv2.FONT_HERSHEY_COMPLEX, scale, color, thickness)
|
上例代码中,content
表示文字的内容,scale
表示文字的大小。
cv2.addWeighted()
依照如下公式混合两张图像。 混合两张图像的操作如下。
1
| img = cv2.addWeighted(img1, alpha, img2, beta, gamma)
|