1.5 通用函数

前文提到,NumPy提供了两种基本的对象,即ndarray和ufunc对象。前面我们介绍了ndarray,本节将介绍ufunc。ufunc是一种能对数组的每个元素进行操作的函数,许多ufunc函数都是用C语言实现的,因此计算速度非常快。此外,它们比math模块中的函数更灵活。math模块中函数的输入一般是标量,但NumPy中函数的输入可以是向量或矩阵,而利用向量或矩阵可以避免使用循环语句,这点在机器学习、深度学习中非常重要。表1-4为几个NumPy中常用的通用函数。

表1-4 几个NumPy中常用的通用函数

说明 sum函数中涉及一个有关轴的参数(即axis),该参数的具体含义可参考图1-9。

图1-9 可视化参数axis的具体含义

1)math与numpy中函数的性能比较:

打印结果如下:

由此可见,numpy.sin比math.sin快近10倍。

2)循环与向量运算的比较。充分使用Python的numpy库中的内置函数,实现计算的向量化,可大大提高运行速度。numpy库中的内置函数使用SIMD指令实现向量化,这要比使用循环的速度快得多。如果使用GPU,其性能将更强大,不过NumPy不支持GPU。

输出结果如下:

从运行结果上来看,使用for循环的运行时间大约是使用向量运算的400倍。因此,在深度学习算法中,我们一般使用向量化矩阵运算。