python库相关整理

NumPy

NumPy是科学计算的基础包之一。通常导入包的操作即NumPy的推荐惯例如下。

1
import numpy as np

ndarray维数组(N-Dimensional Array),是NumPy的关键类型。其属性dtype指示数组元素类型,ndim指示数组的维度,shape用元组的形式表示各维度的大小。np.array是最常见的创建数组的操作,通常代码为如下形式。

1
arr = np.array([0, 1, 2, 3, 4])

数组提供了高速数值操作的节省内存的容器,测量设备记录的信号、图像的像素等数据都可以作为数组。

创建数组的函数

np.array将列表、元组等转换为ndarray,默认直接复制数据,显式指定或自动推导dtype;而np.asarrayarray的区别是,若输入本身是ndarray则不进行复制。np.arange类似内置的range但返回ndarray;而np.linspace通过指定起点、终点和数据点的个数创建数组,在配合Matplotlib绘制函数图像时很常用。

np.onesnp.ones_likenp.zerosnp.zeros_likenp.emptynp.empty_like指定形状或根据已知ndarray的形状创建全1、全0或未初始化的数组。np.eyenp.identity可创建单位方阵;np.diag可指定对角线元素创建对角方阵。

np.random.randnp.random.randn则指定形状创建随机初始化的数组,前者对应均匀分布而后者对应正态分布。

dtype是NumPy能灵活处理其他外界数据的原因,常见的类型有np.int32np.float64。可使用astype创建一个转换类型后的数组拷贝,代码如下。

1
arr = arr.astype(np.float64)

矢量化(Vectorization)即不需要编写循环就能对ndarray的元素执行批量运算,大小相等的ndarray间的任何算术运算都会将运算应用至元素级(Elementwise),ndarray与标量的算术运算也会为各元素执行标量运算。常见的数学函数np.sinnp.lognp.exp等也是元素级的运算。即使ndarray的形状不同,仍然可以通过广播(Broadcasting)机制来执行元素级操作,即通过适当复制元素来扩展数组, 以便在转换之后,两个ndarray具有相同的形状。

可将多个ndarray连结(Concatenate)在一起,需要给出沿着连结的轴,代码如下。

1
arr = np.concatenate([arr1, arr2], axis=0)

np.vstacknp.hstack方法将ndarray分别按垂直、水平的方向叠加。

ndarray的切片是原始数组的视图,即访问数组数据的一种方式,因此数据不会被复制,任何对切片的修改都会反应到原数组上。如果想得到ndarray切片的拷贝而非视图,需要对切片进行显式的复制操作即copy()。可以使用np.may_share_memory()确认两个数组是否共享相同的内存块。

访问矩阵的T属性即转置变换,需要注意转置变换是视图的形式。

运行一些操作可能会导致为新结果分配内存。例如形如arr2 = arr1 + arr2的操作将取消引用arr2指向的ndarray,而是指向新分配的内存处的ndarray。若需要减少内存开销,可使用形如arr2[:] = arr1 + arr2arr2 += arr1的操作。

高维数组的索引访问有两种常见的等价方式,以二维数组为例,arr[i][j]arr[i, j]获取元素的方式是等价的。

花式索引(Fancy Indexing)的内容如下。

  • 布尔型索引(Boolean Indexing):又称掩码(Mask),即作用于索引的布尔型数组,布尔型数组通常由ndarray的比较运算==><产生,或由对布尔型数组的逻辑操作np.logical_ornp.logical_and产生,其中比较运算==也是矢量化的(注意数组级别的相等比较使用np.array_equal方法),因此组合多个布尔条件意味着对布尔型数组执行&|等运算,而使用关键字andor等是非法的;
  • 整型索引(Integer Indexing):使用整数列表或数组进行索引,以通过指定顺序选取子集。

若要将大小为1的ndarray转换为标量,可以调用ndarrayitem()或python的内置函数float()

ndarraymeansumminmax可以分别计算数组元素的均值、总和、最小值和最大值,argminargmax分别获得数组元素最小值的索引和最大值的索引,allany返回布尔型数组任意为真和任一为真的情况,而可选参数axis可控制操作轴即计算的方向。

ndarrayravel方法可将高维数组扁平化,而reshape方法可以重新规划数组形状,transpose方法可进行维度重组。

Matplotlib

Matplotlib是常用的科学绘图库,将数据及各种分析可视化。通常导入包的操作如下。

1
2
import matplotlib as mpl
import matplotlib.pyplot as plt

下述操作保证Matplotlib绘制的图像可在Jupyter Notebook中正确显示。

1
%matplotlib inline

简单地绘制正弦函数的操作如下。

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的方法的形式管理和绘制图像。xlimylim方法分别设置坐标轴横轴和纵轴的极值,axis方法接受一个形如[xmin, xmax, ymin, ymax]的列表以直接设置坐标轴的极值,xticksyticks方法分别设置坐标轴横轴和纵轴需要显示的刻度值,set_xlabelset_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
2
3
cv2.imshow(title, img)
cv2.waitKey(0)
cv2.destroyAllWindows()

调整图像大小的操作如下。

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
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)