通用函数,也可以称为ufunc,是一种在ndarray数据中进行逐元素操作的函数.某些简单函数接收一个或多个标量数值,并产生一个或多个标量结果,而通用函数就是对这些简单函数的向量化封装。
有很多ufunc是简单的逐元素转换,比如sqrt或exp函数:
In [49]: arr = np.arange(10)
In [50]: np.sqrt(arr)
Out[50]:
array([0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
In [51]: np.exp(arr)
Out[51]:
array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
2.98095799e+03, 8.10308393e+03])
上面这两个函数都是一元通用函数,接收两个数组并返回一个数组作为结果,因此称为二元通用函数.比如add或maximum:
In [52]: x = np.random.randn(6)
In [53]: y = np.random.randn(6)
In [54]: x
Out[54]:
array([-0.04433526, 0.46146907, 0.15183098, -0.37106862, -0.19443215,
-0.66353024])
In [55]: y
Out[55]:
array([ 0.60275205, -0.46403985, -0.90029734, 0.68485731, -0.62970257,
1.6368296 ])
In [56]: np.add(x,y)
Out[56]:
array([ 0.55841679, -0.00257078, -0.74846636, 0.31378869, -0.82413472,
0.97329936])
In [57]: np.maximum(x,y)
Out[57]:
array([ 0.60275205, 0.46146907, 0.15183098, 0.68485731, -0.19443215,
1.6368296 ])
这里,numpy.add逐个元素求出x,y的和,numpy.maximum逐个元素地将x和y中元素的最大值计算出来。
也有一些通用函数返回多个数组。比如modf,是Python内建函数divmod的向量化版本。它返回了一个浮点值数组的小数部分和整数部分:
In [60]: arr = np.random.randn(3)*5
In [61]: arr
Out[61]: array([ 0.83514016, -5.42976343, -3.97950723])
In [62]: remainder,whole = np.modf(arr)
In [63]: remainder
Out[63]: array([ 0.83514016, -0.42976343, -0.97950723])
In [64]: whole
Out[64]: array([ 0., -5., -3.])
通用函数接收一个可选参数out,允许对数组按位置操作:
In [65]: arr
Out[65]: array([ 0.83514016, -5.42976343, -3.97950723])
In [66]: np.sqrt(arr)
Out[66]: array([0.91386003, nan, nan])
In [67]: arr
Out[67]: array([ 0.83514016, -5.42976343, -3.97950723])
In [68]: np.sqrt(arr,arr)
Out[68]: array([0.91386003, nan, nan])
In [69]: arr
Out[69]: array([0.91386003, nan, nan])
下列是一些可用的通用函数:
函数名 | 描述 |
---|---|
abs、fabs | 逐个元素计算整数、浮点数或复数的绝对值 |
sqrt | 计算每个元素的平方根(等同于arr**0.5) |
square | 计算每个元素的平方(等同于arr**2) |
函数名 | 描述 |
---|---|
add | 将数组的对应元素相乘 |
subtract | 在第二个数组中,将第一个数组中包含的元素去除 |
multiply | 将数组的对应元素相乘 |
divide | 除或整除(放弃余数) |
power | 将第二个数组的元素作为第一个数组对应元素的幂次方 |
maximum,fmax | 逐个元素计算最大值,fmax忽略nan |
minimum,fmin | 逐个元素计算最小值,fmin忽略nan |
mod | 按元素的求模运算(即求除法的余) |
copysign | 将第一个数组的符号值改为第二个数组的符号值 |