Numpy——核心数据结构

数组

创建数组

正常数组

将一个列表传入到np.array()或者np.asarray()中

1
2
3
import numpy as np

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

特殊数组

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
2
arr = np.array([1, 2, 3, 4])
arr.reshape((2, 2))

size

数组元素的总数

dtype

元素类型

数组的轴

axis一般出现在一些聚合函数中,如np.sum, np.max等等

指按照这个轴进行聚合

数据的加载

这个阶段我们要做的就是把训练数据读进来,然后给模型训练使用。训练数据不外乎这三种:图片、文本以及类似二维表那样的结构化数据。

我们在读入数据时,需要先把数据转换成 NumPy 的数组,然后再进行后续的一系列操作。

以加载图片为例:对于图片的处理,我们一般会使用 Pillow 与 OpenCV 这两个模块

Pillow

1
2
3
4
from PIL import Image

image = Image.open("demo.jpg")
print(image.size)

此时PIL是以二进制读入image的,转为numpy需要np.asarray方法

1
2
3
4
5
6
import numpy as np
from PIL import Image

img = Image.open("demo.jpg")
image_array = np.asarray(img)
print(image_array.shape)

OpenCV

OpenCV读入后自然就是numpy.ndarray数组格式,无需转换

1
2
3
4
5
import cv2

img = cv2.imread("demo.jpg")
type(img)
print(img.shape)

注意:虽然Pillow和OpenCV读入后均是三维RGB系统,但是Pillow的顺序是R,G,B,而OpenCV的顺序是B,G,R

索引和切片

NumPy 数组中经常会出现用冒号来检索数据的形式,如下所示:

1
2
img[:, :, 0]
// 取第三个维度索引为 0 的全部数据

NumPy 数组为我们提供了 np.concatenate((a1, a2, …), axis=0) 方法进行数组拼接。其中,a1,a2, …就是我们要合并的数组;axis 是我们要沿着哪一个维度进行合并,默认是沿着 0 轴方向。

有的时候数组维度不同需要合并,我们需要加维度并填1

np.newaxis可以让数组加一个维度

1
img = img_pillow[:, :, np.newaxis]

绘图我们可以用matplotlib

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from matplotlib import pyplot as plt

plt.subplot(2, 2, 1)
plt.title('Origin Image')
plt.imshow(im_pillow)
plt.axis('off')
plt.subplot(2, 2, 2)
plt.title('Red Channel')
plt.imshow(im_pillow_c1_3ch.astype(np.uint8))
plt.axis('off')
plt.subplot(2, 2, 3)
plt.title('Green Channel')
plt.imshow(im_pillow_c2_3ch.astype(np.uint8))
plt.axis('off')
plt.subplot(2, 2, 4)
plt.title('Blue Channel')
plt.imshow(im_pillow_c3_3ch.astype(np.uint8))
plt.axis('off')
plt.savefig('./rgb_pillow.png', dpi=150)

深拷贝和浅拷贝

np.array() 属于深拷贝,np.asarray() 则是浅拷贝

简单来说,浅拷贝或称视图,指的是与原数组共享数据的数组,请注意,只是数据,没有说共享形状。视图我们通常使用 view() 来创建。常见的切片操作也会返回对原数组的浅拷贝。

而深拷贝又称副本,也就是完全复制原有数组,创建一个新的数组,修改新的数组不会影响原数组。深拷贝使用 copy() 方法。

模型评估

在模型评估时,我们一般会将模型的输出转换为对应的标签。

Argmax, Argmin这两个函数可以求最大 / 最小值对应的索引

Argsort:数组排序后返回原数组的索引

用这几个函数相结合,就可以轻松的求出某数组最大/小的多个数

1
2
arr = np.argsort(-probs)	//加负号降序排序
print(arr[:3])