通用函数,也可以称为ufunc,是一种在ndarray数据中进行逐元素操作的函数,某些简单函数接收一个或多个标量数值,并产生一个或多个标量结果,而通用函数就是对这些简单函数的向量化封装。
有很多ufunc是简单的逐元素转换,比如sqrt(计算每个元素的平方根)或exp(计算每个自然是的自然指数)函数:
import numpy as np
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sqrt(arr)
array([0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
np.exp(arr)
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则会接收两个数组并返回一个数组作为结果,因此称为二元通用函数:
x = np.random.randn(8)
y = np.random.randn(8)
x
array([-1.1397517 , 0.97265244, -0.46907263, 1.53825335, -0.4973196 ,
-0.55674484, -0.20230743, -2.42897899])
y
array([ 0.97921308, -0.26687344, 0.67902616, -0.47888584, -0.56123782,
-1.40019468, -0.65769972, 0.20303061])
np.maximum(x,y)
np.maximum(x,y)
array([ 0.97921308, 0.97265244, 0.67902616, 1.53825335, -0.4973196 ,
-0.55674484, -0.20230743, 0.20303061])
这里,numpy.maximum逐个元素地将x和y中元素的最大值计算出来。
也有一些通用函数返回多个数组。比如modf,是Python内建函数divmod的向量化版本。它返回了一个浮点数值数组的小数部分和整数部分:
arr = np.random.randn(7)*5
arr
array([-12.29659455, 7.36903993, -2.78572404, -1.94801433,
7.49312566, 1.6880044 , -0.93929079])
remainder,whole_part = np.modf(arr)
remainder
array([-0.29659455, 0.36903993, -0.78572404, -0.94801433, 0.49312566,
0.6880044 , -0.93929079])
whole_part
array([-12., 7., -2., -1., 7., 1., -0.])
通用函数接收一个可选参数out,允许对数组按位置操作:
arr
array([-12.29659455, 7.36903993, -2.78572404, -1.94801433,
7.49312566, 1.6880044 , -0.93929079])
np.sqrt(arr)
array([ nan, 2.71459756, nan, nan, 2.73735742,
1.29923223, nan])
np.sqrt(arr,arr)
array([ nan, 2.71459756, nan, nan, 2.73735742,
1.29923223, nan])
arr
array([ nan, 2.71459756, nan, nan, 2.73735742,
1.29923223, nan])