简介
NumPy库主要用于数组(矩阵)计算,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
学习文档:NumPy教程
该教程中有个词:n-uplet,uplet是法语中的元组(tuplet),n-uplet即n元组。
如何理解数组,尤其是多维数组及NumPy中的AXES(Dimensions, Rank)和Axies(Dimension)等概念,是掌握NumPy的基础。
在我个人的学习过程中发现,如果按传统的行列的概念去理解NumPy的一些基本概念可能会造成混淆,尤其是对稍微复杂一些的索引、切片、整数数组索引、花式索引以及argmax等。但如果按“纬度切片”的方式去理解这些概念,会轻松很多。
基本概念
首先,图示Array类的AXES及Axies的概念。
- 二维数组
如上图,NumPy中,AXES就是维度总数(Dimensions,也可以理解为坐标系),Rank就是坐标系中坐标轴的总数,二维数组的Rank等于2,ndim属性也等于2。二维数组有两个Axies(Dimension,也可以称为坐标轴),Axies0是垂直方向的坐标轴(Y轴),Axies1是水平方向的坐标轴(X轴)。
再看下面两幅图,即Axies0和Axies1的切片。-
Axies0切片
-
Axies1切片
-
如上两幅图所示,沿着垂直方向(Axies0)可以划分为2个切片,水平方向(Axies1)可以划分为两个切片。
因此,NumPy中Array类的属性Shape就很好理解了,shape=[2, 3]。
- 三维数组
对于三位数组,Rank = ndim = 3,Axies0是深度(坐标轴的Z轴),Axies1是Y轴,Axies0是X轴。
Axies0可以划分为三个切片,Axies1可以划分为3个切片,Axies0可以划分为三个切片,因此,shape=[3,3,3]。
index及slicing
- index
以二维数组为例,索引b[0, 1] = “Axies0的0号切片([1, 2])与Axies1的1号切片([2, 4, 6])”产生的交集所对应的元素。
In [1]: b = array([[1,2],
[3,4],
[5,6]])
In [2]: b
Out[2]:
array([[1, 2],
[3, 4],
[5, 6]])
In [3]: b[0,1]
Out[3]: 2
- slicing
In [1]: c = array([[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]])
In [2]: c
Out[2]:
array([[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]])
In [3]: c[0:5, 1]
Out[3]: array([ 1, 11, 21, 31, 41])
切片c[0:5, 1] = 取Axies0的编号为0 - 4的切片与Axies1的编号为1的切片所产生的交集所对应的元素。
argmax
沿给定轴返回最大元素的索引。
还是以上面的三维数组为例。
- argmax(0)
#Axies0方向(Z轴)的三个切片(每个切片都是一个2维数组)分别是:
#第一个切片数组
[1, 2, 3]
[3, 4, 5]
[6, 7, 8]
#第二个切片数组
[6, 7, 8]
[3, 4, 5]
[1, 2, 3]
#第三个切片数组
[1, 2, 3]
[6, 7, 8]
[3, 4, 5]
沿axies0(Z轴方向),依次取每个切片对应的二维数组的元素(按[Axies0, Axies1],即从上至下、从左至右)比较每个元素,并返回最大元素的索引。
所以结果就是:
[1, 1, 1]
[2, 2, 2]
[0, 0, 0]
同理:
- argmax(1)
#Axies1方向(Y轴)的三个切片(每个切片都是一个2维数组)分别是:
#第一个切片数组
[1, 2, 3]
[6, 7, 8]
[1, 2, 3]
#第二个切片数组
[3, 4, 5]
[3, 4, 5]
[6, 7, 8]
#第三个切片数组
[6, 7, 8]
[1, 2, 3]
[3, 4, 5]
沿Axies1(Y轴方向),依次取每个切片对应的二维数组的元素(因为切片是Y轴的切片,所以切片数组中,原三维数组Z轴的数据变为Axies0的数据,原三维数组X轴的数据变为Axies1的数据),比较每个元素,并返回最大元素的索引。
所以结果就是:
[2, 2, 2]
[0, 0, 0]
[1, 1, 1]
- argmax(2)
不做累述,结果是:
[2, 2, 2]
[2, 2, 2]
[2, 2, 2]