Pytorch-1
Numpy——核心数据结构
数组
创建数组
正常数组
将一个列表传入到np.array()或者np.asarray()中
1 | import numpy as np |
特殊数组
np.ones(shape, [dtype])
传入形状生成全1数组
np.zeros(shape, [dtype])
传入形状生成全0数组
np.arrange([start], stop, [step])
start默认0,step默认1
生成[start, stop)间隔为step的数组
np.linspace(start, stop, num=50, endpoint=True, retstep=False)
生成[start, stop)中的一个等差数列,有num个元素
endPoint:True的话最后一个元素是stop
retstep:True的话返回数组和公差
数组的属性
ndim
数组维度个数
1 | print(arr.ndim) |
shape
是一个元组,表示数组每一维度有几个元素
1 | print(arr.shape) |
形状变换可以使用reshape函数
1 | arr = np.array([1, 2, 3, 4]) |
size
数组元素的总数
dtype
元素类型
数组的轴
axis一般出现在一些聚合函数中,如np.sum, np.max等等
指按照这个轴进行聚合
数据的加载
这个阶段我们要做的就是把训练数据读进来,然后给模型训练使用。训练数据不外乎这三种:图片、文本以及类似二维表那样的结构化数据。
我们在读入数据时,需要先把数据转换成 NumPy 的数组,然后再进行后续的一系列操作。
以加载图片为例:对于图片的处理,我们一般会使用 Pillow 与 OpenCV 这两个模块
Pillow
1 | from PIL import Image |
此时PIL是以二进制读入image的,转为numpy需要np.asarray方法
1 | import numpy as np |
OpenCV
OpenCV读入后自然就是numpy.ndarray数组格式,无需转换
1 | import cv2 |
注意:虽然Pillow和OpenCV读入后均是三维RGB系统,但是Pillow的顺序是R,G,B,而OpenCV的顺序是B,G,R
索引和切片
NumPy 数组中经常会出现用冒号来检索数据的形式,如下所示:
1 | img[:, :, 0] |
NumPy 数组为我们提供了 np.concatenate((a1, a2, …), axis=0) 方法进行数组拼接。其中,a1,a2, …就是我们要合并的数组;axis 是我们要沿着哪一个维度进行合并,默认是沿着 0 轴方向。
有的时候数组维度不同需要合并,我们需要加维度并填1
np.newaxis可以让数组加一个维度
1 | img = img_pillow[:, :, np.newaxis] |
绘图我们可以用matplotlib
1 | from matplotlib import pyplot as plt |
深拷贝和浅拷贝
np.array() 属于深拷贝,np.asarray() 则是浅拷贝
简单来说,浅拷贝或称视图,指的是与原数组共享数据的数组,请注意,只是数据,没有说共享形状。视图我们通常使用 view() 来创建。常见的切片操作也会返回对原数组的浅拷贝。
而深拷贝又称副本,也就是完全复制原有数组,创建一个新的数组,修改新的数组不会影响原数组。深拷贝使用 copy() 方法。
模型评估
在模型评估时,我们一般会将模型的输出转换为对应的标签。
Argmax, Argmin这两个函数可以求最大 / 最小值对应的索引
Argsort:数组排序后返回原数组的索引
用这几个函数相结合,就可以轻松的求出某数组最大/小的多个数
1 | arr = np.argsort(-probs) //加负号降序排序 |