Numpy 是 Python 的一个科学计算库,在数学、统计、工程等方面都有非常好的应用。Numpy 对多维数组的支持也非常完善,包括矩阵的运算,高维数组运算等。很多库都依赖于 Numpy,例如 PyTorch,Tensorflow 等,尤其涉及到多维数组的操作时,更是少不了 Numpy。本篇基础教程由 PyTorch 中文网整理,希望帮助每个刚刚接触 Numpy 的朋友快速入门。
文章目录
什么是 NumPy?
NumPy 是Python 语言的一个扩展程序库。支持高端大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy 引入了多维数组以及可以直接有效率地操作多维数组的函数与运算符。因此在 NumPy 上只要能被表示为针对数组或矩阵运算的算法,其运行效率几乎都可以与编译过的等效 C 语言代码一样快。
NumPy 提供了与 MATLAB 相似的功能与操作方式,因为两者皆为解释型语言,并且都可以让用户在针对数组或矩阵运算时提供较标量运算更快的性能。从本质上来说,NumPy 与 MATLAB 同样是利用 BLAS 与 LAPACK 来提供高效率的线性代数运算。
How to install NumPy?
可以使用 conda 或 pip 来安装 NumPy:
Conda 安装:
1 | conda conda install -c anaconda numpy |
Pip 安装:
1 | pip install numpy |
如果需要在 Jupyter Notebook 中安装:
1 2 | import sys !conda install --yes --prefix {sys.prefix} numpy |
要使用 NumPy,首先要引入:
1 | import numpy as np |
创建数组
在 NumPy 中创建一个数组最简单的方法是从 Python 本身的 list
转换而来:
1 2 | myPythonList = [1,9,8,3] numpy_array_from_list = np.array(myPythonList) |
实际使用中,这两句可以合并:
1 | a = np.array([1,9,8,3]) |
数组的形状
可以使用 shape
属性来查看数组的形状,也可以用 dtype
属性查看数组元素的类型:
1 2 3 4 5 6 7 | import numpy as np a = np.array([1,2,3]) print(a.shape) print(a.dtype) (3,) int64 |
多维数组
可以用双尖括号([]
)来创建多维数组,每个维度之间用逗号分隔,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ### 二维 c = np.array([(1,2,3), (4,5,6)]) print(c.shape) (2, 3) ### 三维 d = np.array([ [[1, 2,3], [4, 5, 6]], [[7, 8,9], [10, 11, 12]] ]) print(d.shape) (2, 2, 3) |
np.zeros 和 np.ones
这两个命令可以创建值全部为 0 或全部为 1 的数组,一般用来初始化一个数组的时候:
1 2 | numpy.zeros(shape, dtype=float, order='C') numpy.ones(shape, dtype=float, order='C') |
这里面的参数:
shape
:形状dtype
:数据类型order
:C 代表行优先;F 代表列优先
例如:
1 2 3 4 5 6 7 8 9 10 11 | np.zeros((2,2)) 输出: array([[0., 0.], [0., 0.]]) np.zeros((2,2), dtype=np.int16) 输出: array([[0, 0], [0, 0]], dtype=int16) |
数组形状变换
有些时候需要对数组的形状进行变换,例如:
1 2 3 | e = np.array([(1,2,3), (4,5,6)]) print(e) e.reshape(3,2) |
输出:
1 2 3 4 5 6 | [[1 2 3] [4 5 6]] array([[1, 2], [3, 4], [5, 6]]) |
如果需要把一个多维数组“拍平”,可以使用 flatten
函数:
1 2 3 4 | e.flatten() 输出: array([1, 2, 3, 4, 5, 6]) |
hstack 和 vstack
这两个函数分别用于在水平方向和竖直方向增加数据,我们来看具体例子:
1 2 3 4 5 6 7 8 9 | f = np.array([1,2,3]) g = np.array([4,5,6]) print('水平方向:', np.hstack((f, g))) print('竖直方向:', np.vstack((f, g))) 水平方向: [1 2 3 4 5 6] 竖直方向: [[1 2 3] [4 5 6]] |
生成随机数
用下列语句可以生成随机的高斯分布:
1 | numpy.random.normal(loc, scale, size) |
- Loc: 平均值
- scale: 标准差(standard deviation)
- Size: 返回多少个数
我们来看下面的例子:
1 2 3 | normal_array = np.random.normal(5, 0.5, 10) print(normal_array) [5.56171852 4.84233558 4.65392767 4.946659 4.85165567 5.61211317 4.46704244 5.22675736 4.49888936 4.68731125] |
如果将这个分布画出来,符合下列分布:
生成区间
有些时候我们需要在一个区间内的一些数,这个时候要用到 arange
。
1 | numpy.arange(start, stop, step) |
- Start: 区间开始
- Stop: 区间结束
- Step: 步长,默认为 1
1 | numpy.linspace(start, stop, num, endpoint) |
例如:
1 2 3 4 5 6 7 8 9 | np.arange(1, 11) 输出: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) np.arange(1, 14, 4) 输出: array([ 1, 5, 9, 13]) |
Linspace
这个方法可以在一个区间内平均地生成多个数。
- Start: 数列开始的值
- Stop: 数列结束的值
- Num: 生成的数量,默认 50
- Endpoint: 默认是 True,如果是 True, 则数列包含最后的 stop 值,反之不包含
1 2 3 4 | np.linspace(1.0, 5.0, num=10) 输出: array([1. , 1.44444444, 1.88888889, 2.33333333, 2.77777778, 3.22222222, 3.66666667, 4.11111111, 4.55555556, 5. ]) |
如果不包含最后一个数:
1 2 3 4 | np.linspace(1.0, 5.0, num=5, endpoint=False) 输出: array([1. , 1.8, 2.6, 3.4, 4.2]) |
点乘
我们可以用 np.dot
实现矩阵的点乘操作:
1 2 3 4 5 | ### Dot product: product of two arrays f = np.array([1,2]) g = np.array([4,5]) ### 1*4+2*5 np.dot(f, g) |
矩阵相乘
同样,可以用 np.matmul
实现矩阵相乘的操作:
1 2 3 4 5 6 7 8 | ### Matmul: matruc product of two arrays h = [[1,2],[3,4]] i = [[5,6],[7,8]] ### 1*5+2*7 = 19 np.matmul(h, i) array([[19, 22], [43, 50]]) |
希望本教程对你入门有所帮助。
本站微信群、QQ群(三群号 726282629):