本教程内容旨在帮助没有基础的同学快速掌握 numpy 的常用功能,保证日常绝大多数场景的使用。可作为机器学习或深度学习的先修课程,也可作为快速备查手册。
值得一提的是,深度学习的各大框架很多 API 和 numpy 也是一脉相承的哦,可以说 numpy 玩儿熟了,几个深度学习框架的不少 API 也同时学会了。本文是教程的「第一部分」,从实际的代码应用出发,讲解了Numpy创建到统计的操作。
开源项目地址:https://github.com/datawhalechina/powerful-numpy
注:B站有作者倾情讲解的视频教程(B站观看人数破万啦٩(๑>◡<๑)۶),欢迎关注账号二次元的Datawhale搜索「巨硬的Numpy」,获取一手讲解。
教程原则如下:
· 偏实用高频 API
· 展示实际用法
· 简单直接
使用说明:内容中⭐(1-5个)表示重要程度,越多越重要;⚠️ 表示需要特别注意的
提示:使用过程中无须过多关注 API 各种参数细节,教程提供的用法足以应付绝大部分场景,更深入的可自行根据需要探索或学习后续的教程。
下面正式开始讲解。
# 导入 library
import numpy as np
# 画图工具
import matplotlib.pyplot as plt
创建和生成
本节主要介绍 array 的创建和生成。为什么会把这个放在最前面呢?主要有以下两个方面原因:
首先,在实际工作过程中,我们时不时需要验证或查看 array 相关的 API 或互操作。同时,有时候在使用 sklearn,matplotlib,PyTorch,Tensorflow 等工具时也需要一些简单的数据进行实验。
所以,先学会如何快速拿到一个 array 是有很多益处的。本节我们主要介绍以下几种常用的创建方式:
-
使用列表或元组
-
使用 arange
-
使用 linspace/logspace
-
使用 ones/zeros
-
使用 random
-
从文件读取
其中,最常用的一般是 linspace/logspace 和 random,前者常常用在画坐标轴上,后者则用于生成「模拟数据」。举例来说,当我们需要画一个函数的图像时,X 往往使用 linspace 生成,然后使用函数公式求得 Y,再 plot;当我们需要构造一些输入(比如 X)或中间输入(比如 Embedding、hidden state)时,random 会异常方便。
从 python 列表或元组创建
⭐⭐ 重点掌握传入 list 创建一个 array 即可:np.array(list)
⚠️ 需要注意的是:「数据类型」。如果您足够仔细的话,可以发现下面第二组代码第 2 个数字是「小数」(注:Python 中 1. == 1.0),而 array 是要保证每个元素类型相同的,所以会帮您把 array 转为一个 float 的类型。
# 一个 list
np.array([1,2,3])
array([1, 2, 3])
# 二维(多维类似)
# 注意,有一个小数哦
np.array([[1, 2., 3], [4, 5, 6]])
array([[1., 2., 3.],
[4., 5., 6.]])
# 您也可以指定数据类型
np.array([1, 2, 3], dtype=np.float16)
array([1., 2., 3.], dtype=float16)
# 如果指定了 dtype,输入的值都会被转为对应的类型,而且不会四舍五入
lst = [
[1, 2, 3],
[4, 5, 6.8]
]
np.array(lst, dtype=np.int32)
array([[1, 2, 3],
[4, 5, 6]], dtype=int32)
# 一个 tuple
np.array((1.1, 2.2))
array([1.1, 2.2])
# tuple,一般用 list 就好,不需要使用 tuple
np.array([(1.1, 2.2, 3.3), (4.4, 5.5, 6.6)])
array([[1.1, 2.2, 3.3],
[4.4, 5.5, 6.6]])
# 转换而不是上面的创建,其实是类似的,无须过于纠结
np.asarray((1,2,3))
array([1, 2, 3])
np.asarray(([1., 2., 3.], (4., 5., 6.)))
array([[1., 2., 3.],
[4., 5., 6.]])
使用 arange 生成
⭐⭐
range 是 Python 内置的整数序列生成器,arange 是 numpy 的,效果类似,会生成一维的向量。我们偶尔会需要使用这种方式来构造 array,比如:
-
需要创建一个连续一维向量作为输入(比如编码位置时可以使用)
-
需要观察筛选、抽样的结果时,有序的 array 一般更加容易观察
⚠️ 需要注意的是:在 reshape
时,目标的 shape 需要的元素数量一定要和原始的元素数量相等。
np.arange(12).reshap