简介
NumPy的基本对象是它的ndarray,这是一个n维数组,它也经常出现在面向数组的语言中。本篇内容将一起了解下n维数组中轴符号和矢量化操作,以便可以充分使用NumPy。
这里从形成一个包含36个元素的三维数组开始。
在二维中描绘高维数组可能会比较困难。考虑数组形状的一种直观方法是简单地“从左到右读取它”。arr 是一个3乘4乘3的数组。在视觉上,arr可以被认为是三个4x3网格的容器,用图像表示大概是如下图。
如果是四维或者更多维,很难用图片展示出结构,可以想象是多个三维的数组组成,套娃式的理解。如果需要构造多维的数组时,也可以按照下面的理解方法。可根据自己需求改变参数即可。
如上图中设置reshape(2,3,4,5),表示我们创建了个四维数组。
这个四维数组包含2个三维数组;
每个三维数组中包含3个二维数组;
每个二维数组的行为4,列为5。
轴符号
在NumPy中,轴代表的一个多维数组的某一个维度,轴的数量是与维度数量相等的,但是需要注意轴是从0开始的。下面再测验下轴的顺序。
这里根据结果反推轴的位置,上面分别设置了axis=0,1,2,3。
当axis=0,计算作用在第四维,将包含的2个三维数组相加;
当axis=1,计算作用在第三维,将包含的2个二维数组相加;
当axis=2,计算作用在第二维,将包含的2个列相加;
当axis=3,计算作用在第三维,将包含的2个行相加;
可以发现axis从小到大的话,作用到数组的顺序是由外向内的。
矢量化
首先看看什么是矢量,广泛的解释:矢量(英语:Vector)是数学、物理学和工程科学等多个自然科学中的基本概念,指一个同时具有大小和方向的几何对象,因常常以箭头符号标示以区别于其它量而得名。直观上,矢量通常被标示为一个带箭头的线段。线段的长度可以表示矢量的大小,而矢量的方向也就是箭头所指的方向。
在数组中进行矢量化操作是什么呢:矢量化是作用在整个数组上而不是在各个元素上发生的。
通常,矢量化数组操作通常比其纯Python操作要快,在任何类型的数值计算中都具有最大的影响。在Python中循环数组或任何数据结构时,会涉及很多开销。 NumPy中的矢量化操作将内部循环委托给高度优化的C和Fortran函数,从而实现更清晰,更快速的Python代码。下面用示例展示效果。
考虑一个True和False的一维向量,你要为其计算序列中“False to True”转换的数量,首先是用纯Python实现下。
上面示例中使用了np.random.seed()函数,使用该函数的主要作用是保证每次生成的数组中的值是一致的,对其中传入的参数也随意,使用不同参数下生成的数组中的值是不同。在保证了每次使用的数组是相同的,这样就能够对比Python原生语法和调用NumPy两种方法的效率对比。
第一次对比的时候设置的size比较小,整体运行下来所用时间也很短,这种情况下调用(Python/NumPy)得到的时间比值为2.8。
总感觉这样不科学,再次使用祖传的控制变量法,改变size并保持p不变,改变p并保持size不变。
经过多次的测试,最终的效率比保持在了65左右,很直观的看出来这两种矢量化操作在效率上差了很多,NumPy胜出很多。
总结
本次分享首先解释了数组维度和轴,接着用运行结果反推找到了维度和轴的使用顺序。矢量化是作用在整个数组上而不是在各个元素上发生的,通过Python和NumPy两种方法的运行,对比出NumPy在效率上更胜出。
谢谢浏览,文中有不正确的地方欢迎指出~