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)
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(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.arange(5)
>>> array([0, 1, 2, 3, 4])
np.arange(2, 5)
>>> array([2, 3, 4])
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 数组的相关操作。
2.1 数据加载阶段
|