数组本质上是一种数据结构,数据结构除了首先满足数据的合理组织和存储外,最重要的一点是,不同的数据结构会有各自支持的运算。
NumPy数组可以支持各种算术运算、逻辑运算等,但是,本文的所谓3中运算类型不是按照这种分类方式,而是从数组运算的操作数的类型来进行分类。
本文的主要内容有:
1、向量化
2、形状相同的数组运算
3、数组与标量的运算
3、形状不同的数组运算
向量化NumPy中数组的运算最大的优势在于,不用编写循环即可完成数组数据的批量运算,这种特性通常被称之为“向量化(vectorization)”。
利用向量化的特性,可以提高计算的效率和代码的可读性。
向量化利用了NumPy的底层优化,使得对数组的操作可以在C语言级别上实现,而无需使用Python的循环结构。
简单总结一下向量化的主要特点:
1、性能提升:向量化操作通常比使用Python循环要快得多,因为NumPy在内部使用C语言实现,能够更加高效地处理数组运算。
2、简洁的代码:向量化可以使得代码更加简洁和易读,减少行数,提高可维护性。
3、避免循环开销:Python的循环会引入额外的开销,而NumPy通过底层实现消除了这些开销。
形状相同的数组运算在NumPy中,形状相同的两个数组之间是可以直接进行各种运算的,而且运算的效果会应用到元素级。
通过代码简单演示这种特性:
从上述代码及其执行结果中,可以看出,两个形状相同的数组其直接运算的结果还是一个形状相同的数组,其元素为参与运算的相同位置的元素进行对应运算的结果。
数组与标量的运算首先明确一下什么是标量,所谓的标量,可以理解为就是一个数字。标量其实是与向量(或者矢量)的概念相对应的。有数学基础的应该都比较清楚,感兴趣的同学,可以自行查阅。
数组与标量运算的结果仍然是一个数组,其效果是将运算传播到数组中的每一个元素。
同样通过代码举例说明:
从上述代码及其运算结果中,可以看出运算被传播到每一个元素中了。此外,根据运算的类型是算术运算还是逻辑运算,决定了结果是数值数组还是布尔数组。
形状不同的数组运算如果两个数组的形状不同,正常来说是不应该直接进行运算的。但是,当两个数组虽然形状不同,但是可以通过相应的形状扩展,变为相同的数组时,还是可以进行运算的,这种机制被称之为“广播(broadcast)”。
关于广播的机制,稍微有些复杂,在后面的文章将会专门介绍。接下来,仅就形状不同数组的运算进行简单演示:
总结本文按照运算的操作数的类型,将NumPy数组的运算分为:形状相同的数组的运算、数组与标量的运算、不同形状的数组的运算。NumPy数组的运算,其实是基于向量化的机制来实现的,所以数组运算,可以不用写循环代码,代码可读性和效率都较高。