1. ndarray中的应用
在使用numpy为基的数据分析中,新手逃不过的就是对于高维数据的认识,尤其是在数据广播,数据reshape乃至神经网络中的特征数组等变化中,常常因为对“维度”这一词的理解停留在长宽高的固有认知中,导致数据维度一高就无法做出正确的变化理解。但不可否认的是,维度的变化在数据分析、机器学习等领域有重要的身份,理解numpy高维数组至关重要。
2. 高维数组的多种理解
2.1 几何化理解
最一般的理解,就是将三维及以下的数组理解成几何图形。一般的,将数据理解为从前往后的堆叠,将一维和二维数组理解为二维平面,将三维理解成立体长方体,即对于一个adarry ( x , y , z ) (x,y,z) (x,y,z)理解为,将多个数据堆叠为长为 x x x的一维数组,再将这个一维数组堆叠为行数为 y y y的二维数组,再将这个二维数组堆叠为厚度为 z z z的三维数组。这样的理解从好处看,容易可视化,但是,对于axis却是反直觉的。如下2-1代码所示:
#2-1三维代码
arr1 = np.arange(24).reshape(4,3,2)
arr1
其输出结果如下图2-1所示:
从输出结果,可以发现,numpy在做多维数组创建时实际上是从后往前迭代的,即对于三维数组
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)的生成过程为,先将数据以
z
z
z长度堆叠为一维数组,再将长度为
z
z
z的一维数组堆叠
y
y
y次得到一个行为
y
y
y,列为
z
z
z的二维数组,最后将这个二维数组堆叠
z
z
z次即可。
2.2 图书馆系统
在2.1的最后可以推出一个结论,numpy中的ndarray实际上是完成了从后往前以此堆叠的过程,实际上这个过程如同图书馆的过程。我们假设每个数据元素就是书本中的某一个字,那么由多个数字堆叠出了一行的内容,由多行内容堆叠出了一页的内容,多页内容堆叠出了一节的内容,多节的内容堆叠出了一章的内容,多章的内容堆叠出了一本书,而多本书又构成了某个国家某个地区某个图书股的某一个书柜的某一行。这个概念可以无限的堆下去,只要你愿意。其本质就在于堆叠,底层的堆叠构成了上一层的一个元素。可以理解为一个数学上的换元过程,但换元过程只完成了对于两层之间的堆叠过程,将无限制的堆叠弱化了。
2.3 变量&属性
无论多少维度的数据,任何操作的最终的落脚点都在数据元素上,如果用图书馆系统来解释的话,就是每一个字。如何找到一个字呢?那就需要具体位置的书的具体章节具体页,就比如要找的是某某图书馆第一个书架的第一排的第一本书的第一章第一节的第一个字,表示出来的索引就是 ( 某某图书馆 , 1 架 , 1 排 , 1 本 , 1 章 , 1 节 , 1 个) (某某图书馆,1架,1排,1本,1章,1节,1个) (某某图书馆,1架,1排,1本,1章,1节,1个)。
在实际任务中,常常会出现在很高维度的数据组中对于某一个axis方向上的操作,如果仅仅是三维以下的操作,还是想一下就能得到结果的,但是如果维度一旦超过了三维,就会出现问题。还是拿2.2的图书馆系统来举例,对于某个axis的操作可以具象化为:我希望查询图书馆的每一排第一本书的第一章第一节的第一个字,那么其索引就成了(某某图书馆,1架,ALL排,1本,1章,1节,1个)那么就可以说,这是对于axis=排进行了操作。
很明显,对于图书馆系统这样的堆叠理解对于axis方向的理解是非常抽象的。但是,如果回到2.1提到的几何理解,axis的理解反而就简单了。如图2-2所示:
如果我们自习分析这张图,不难发现两个点:1.对于axis的概念我们能直观的感觉到。2.axis的顺序刚好是从前往后依次递增的。
之所以我们对几何化后的数组的axis掌握如此迅速,而对于图书馆系统无法做到如此直观,在于图书馆系统的核心在于堆叠,但过度强化了堆叠的概念,就好像俄罗斯套娃又或是一个套了无数层快递包装的快递,其核心还是停留在了三维世界,只不过人为的赋予了更高的维度。
到这才引出了这一节的内容,从变量的角度理解高维数组。还是回到图书馆系统,要找的是某某图书馆第一个书架的第一排的第一本书的第一章第一节的第一个字,表示出来的索引就是(某某图书馆,1架,1排,1本,1章,1节,1个),实际上我们可以将这个索引拆解成7个相互独立的变量
x
1
−
x
7
x_1-x_7
x1−x7,分别是哪个图书馆,哪个书架,哪排,哪本,哪章,哪节,哪个。只不过在这个系统中,看似是强相互作用的,因为哪个影响了堆叠成行的过程,而行又影响了堆叠页的过程以此类推。但实际上并不是如此。
如果放到现实世界,利用iris数据集举例。iris数据集中有四个属性分别是:花萼长度,花萼宽度,花瓣长度,花瓣宽度,如果我们以花瓣长度作为axis轴进行相加,翻译成自然语言就是对于任意的花萼长度
a
a
a,花萼宽度
b
b
b,花瓣宽度
c
c
c,取出所有的花瓣长度并相加。可以看出,利用四个属性就很好的表示出了一个四维数组对于axis的操作。