Numpy核心与在DeepLearning的常用操作
现在的主流深度学习框架 PyTorch 与 TensorFlow 中最基本的计算单元 Tensor,都与 NumPy 数组有着类似的计算逻辑,所以掌握了 NumPy 对学习这两种框架都有很大帮助。
NumPy 是用于 Python 中科学计算的一个基础包。它提供了一个多维度的数组对象(稍后展开),以及针对数组对象的各种快速操作,例如排序、变换,选择等。
1. Numpy核心数据结构
NumPy 数组
数组对象是 NumPy 中最核心的组成部分,这个数组叫做 ndarray,是“N-dimensional array”的缩写。其中的 N 是一个数字,指代维度。
1.1 创建数组
最简单的方法就是把一个列表传入到 np.array() 或 np.asarray() 中,这个列表可以是任意维度的。
np.array() 属于深拷贝,np.asarray() 则是浅拷贝。
import numpy as np
arr_1_d = np.asarray([1])
print(arr_1_d)
>>> [1]
arr_2_d = np.asarray([[1, 2], [3, 4]])
print(arr_2_d)
>>> [[1 2]
[3 4]]
1.2 数组的属性
- ndim
ndim 表示数组维度(或轴)的个数。刚才创建的数组 arr_1_d 的轴的个数就是 1,arr_2_d 的轴的个数就是 2。
arr_1_d.ndim
1
arr_2_d.ndim
2
- shape
shape 表示数组的维度或形状, 是一个整数的元组,元组的长度等于 ndim。
arr_1_d 的形状就是(1,)(一个向量), arr_2_d 的形状就是 (2, 2)(一个矩阵)。
arr_1_d.shape
>>> (1,)
arr_2_d.shape
>>> (2, 2)
-
size
size,也就是数组元素的总数,它就等于 shape 属性中元素的乘积。 -
dtype
dtype是一个描述数组中元素类型的对象。使用 dtype 属性可以查看数组所属的数据类型。NumPy 中大部分常见的数据类型都是支持的,例如 int8、int16、int32、float32、float64 等。dtype 是一个常见的属性,在创建数组,数据类型转换时都可以看到它。
arr_2_d = np.asarray([[1, 2], [3, 4]], dtype='float')
arr_2_d.dtype
>>> dtype('float64')
数组的数据类型当然也可以改变,我们可以使用 astype() 改变数组的数据类型,不过改变数据类型会创建一个新的数组,而不是改变原数组的数据类型。
arr_2_d.dtype
>>> dtype('float64')
arr_2_d.astype('int32')
>>> array([[1, 2],
[3, 4]], dtype=int32)
arr_2_d.dtype
>>> dtype('float64')
# 原数组的数据类型并没有改变
arr_2_d_int = arr_2_d.astype('int32')
arr_2_d_int.dtype
>>> dtype('int32')
不能通过直接修改数据类型来修改数组的数据类型,这样代码虽然不会报错,但是数据会发生改变.
1.3 其他创建数组的方式
- np.ones
>>>np.ones(shape=(2,3))
array([[1., 1., 1.],
[1., 1., 1.]])
>>>np.ones(shape=(2,3), dtype='int32')
array([[1, 1, 1],
[1, 1, 1]], dtype=int32)
-
np.zeros()
-
np.arange()
# 创建从0到4的数组
np.arange(5)
>>> array([0, 1, 2, 3, 4])
# 从2开始到4的数组
np.arange(2, 5)
>>> array([2, 3, 4])
# 从2开始,到8的数组,跨度是3
np.arange(2, 9, 3)
>>> array([2, 5, 8])
- np.linspace()
可以用 np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)创建一个数组,具体就是创建一个从开始数值到结束数值的等差数列。- start:必须参数,序列的起始值。
- stop:必须参数,序列的终点。
- num:序列中元素的个数,默认是 50。
- endpoint:默认为 True,如果为 True,则数组最后一个元素是 stop。
- retstep:默认为 False,如果为 True,则返回数组与公差。
1.4 数组的轴
这是一个非常重要的概念,也是 NumPy 数组中最不好理解的一个概念。它经常出现在 np.sum()、np.max() 这样关键的聚合函数中。
2. 深度学习中的常用操作
以一个图像分类项目为例,看看NumPy 的在实际项目中都有哪些重要功能。
想要解决这个图片分类问题,任务可以分解成数据加载、训练与模型评估三部分。其中数据加载跟模型评估中,就经常会用到 NumPy 数组的相关操作。