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默认直接复制数据显式指定或自动推导dtypenp.asarrayarray的区别是若输入本身是ndarray则不进行复制np.arange类似内置的range但返回ndarraynp.linspace通过指定起点终点和数据点的个数创建数组在配合Matplotlib绘制函数图像时很常用

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

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

dtypeNumPy能灵活处理其他外界数据的原因常见的类型有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)使用整数列表或数组进行索引以通过指定顺序选取子集

若要将大小为1ndarray转换为标量可以调用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()

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