通用函数:快速的元素级数组函数

通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。你可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。

许多ufunc都是简单的元素级变体,如sqrt和exp:

  1. In [120]: arr = np.arange(10)
  2.  
  3. In [121]: np.sqrt(arr)
  4. Out[121]:
  5. array([ 0. , 1. , 1.4142, 1.7321, 2. , 2.2361, 2.4495,
  6. 2.6458, 2.8284, 3. ])
  7.  
  8. In [122]: np.exp(arr)
  9. Out[122]:
  10. array([ 1. , 2.7183, 7.3891, 20.0855, 54.5982,
  11. 148.4132, 403.4288, 1096.6332, 2980.958 , 8103.0839])

这些都是一元(unary)ufunc。另外一些(如add或maximum)接受2个数组(因此也叫二元(binary)ufunc),并返回一个结果数组:

  1. In [123]: x = randn(8)
  2.  
  3. In [124]: y = randn(8)
  4.  
  5. In [125]: x
  6. Out[125]:
  7. array([ 0.0749, 0.0974, 0.2002, -0.2551, 0.4655, 0.9222, 0.446 , -0.9337])
  8.  
  9. In [126]: y
  10. Out[126]:
  11. array([ 0.267 , -1.1131, -0.3361, 0.6117, -1.2323, 0.4788, 0.4315, -0.7147])
  12.  
  13. In [127]: np.maximum(x, y) # 元素级最大值
  14. Out[127]:
  15. array([ 0.267 , 0.0974, 0.2002, 0.6117, 0.4655, 0.9222, 0.446 , -0.7147])

虽然并不常见,但有些ufunc的确可以返回多个数组。modf就是一个例子,它是Python内置函数divmod的矢量化版本,用于浮点数数组的小数和整数部分。

  1. In [128]: arr = randn(7) * 5
  2.  
  3. In [129]: np.modf(arr)
  4. Out[129]:
  5. (array([-0.6808, 0.0636, -0.386 , 0.1393, -0.8806, 0.9363, -0.883 ]),
  6. array([-2., 4., -3., 5., -3., 3., -6.]))

表4-3和表4-4分别列出了一些一元和二元ufunc。

通用函数:快速的元素级数组函数 - 图1

通用函数:快速的元素级数组函数 - 图2

通用函数:快速的元素级数组函数 - 图3

通用函数:快速的元素级数组函数 - 图4

通用函数:快速的元素级数组函数 - 图5