通用函数:快速的元素级数组函数
通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。你可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。
许多ufunc都是简单的元素级变体,如sqrt和exp:
- In [120]: arr = np.arange(10)
- In [121]: np.sqrt(arr)
- Out[121]:
- array([ 0. , 1. , 1.4142, 1.7321, 2. , 2.2361, 2.4495,
- 2.6458, 2.8284, 3. ])
- In [122]: np.exp(arr)
- Out[122]:
- array([ 1. , 2.7183, 7.3891, 20.0855, 54.5982,
- 148.4132, 403.4288, 1096.6332, 2980.958 , 8103.0839])
这些都是一元(unary)ufunc。另外一些(如add或maximum)接受2个数组(因此也叫二元(binary)ufunc),并返回一个结果数组:
- In [123]: x = randn(8)
- In [124]: y = randn(8)
- In [125]: x
- Out[125]:
- array([ 0.0749, 0.0974, 0.2002, -0.2551, 0.4655, 0.9222, 0.446 , -0.9337])
- In [126]: y
- Out[126]:
- array([ 0.267 , -1.1131, -0.3361, 0.6117, -1.2323, 0.4788, 0.4315, -0.7147])
- In [127]: np.maximum(x, y) # 元素级最大值
- Out[127]:
- array([ 0.267 , 0.0974, 0.2002, 0.6117, 0.4655, 0.9222, 0.446 , -0.7147])
虽然并不常见,但有些ufunc的确可以返回多个数组。modf就是一个例子,它是Python内置函数divmod的矢量化版本,用于浮点数数组的小数和整数部分。
- In [128]: arr = randn(7) * 5
- In [129]: np.modf(arr)
- Out[129]:
- (array([-0.6808, 0.0636, -0.386 , 0.1393, -0.8806, 0.9363, -0.883 ]),
- array([-2., 4., -3., 5., -3., 3., -6.]))
表4-3和表4-4分别列出了一些一元和二元ufunc。