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

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

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

  1. In [137]: arr = np.arange(10)
  2. In [138]: arr
  3. Out[138]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
  4. In [139]: np.sqrt(arr)
  5. Out[139]:
  6. array([ 0. , 1. , 1.4142, 1.7321, 2. , 2.2361, 2.4495,
  7. 2.6458, 2.8284, 3. ])
  8. In [140]: np.exp(arr)
  9. Out[140]:
  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 [141]: x = np.random.randn(8)
  2. In [142]: y = np.random.randn(8)
  3. In [143]: x
  4. Out[143]:
  5. array([-0.0119, 1.0048, 1.3272, -0.9193, -1.5491, 0.0222, 0.7584,
  6. -0.6605])
  7. In [144]: y
  8. Out[144]:
  9. array([ 0.8626, -0.01 , 0.05 , 0.6702, 0.853 , -0.9559, -0.0235,
  10. -2.3042])
  11. In [145]: np.maximum(x, y)
  12. Out[145]:
  13. array([ 0.8626, 1.0048, 1.3272, 0.6702, 0.853 , 0.0222, 0.7584,
  14. -0.6605])

这里,numpy.maximum计算了x和y中元素级别最大的元素。

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

  1. In [146]: arr = np.random.randn(7) * 5
  2. In [147]: arr
  3. Out[147]: array([-3.2623, -6.0915, -6.663 , 5.3731, 3.6182, 3.45 , 5.0077])
  4. In [148]: remainder, whole_part = np.modf(arr)
  5. In [149]: remainder
  6. Out[149]: array([-0.2623, -0.0915, -0.663 , 0.3731,
  7. 0.6182, 0.45 , 0.0077])
  8. In [150]: whole_part
  9. Out[150]: array([-3., -6., -6., 5., 3., 3., 5.])

Ufuncs可以接受一个out可选参数,这样就能在数组原地进行操作:

  1. In [151]: arr
  2. Out[151]: array([-3.2623, -6.0915, -6.663 , 5.3731, 3.6182, 3.45 , 5.0077])
  3. In [152]: np.sqrt(arr)
  4. Out[152]: array([ nan, nan, nan, 2.318 , 1.9022, 1.8574, 2.2378])
  5. In [153]: np.sqrt(arr, arr)
  6. Out[153]: array([ nan, nan, nan, 2.318 , 1.9022, 1.8574, 2.2378])
  7. In [154]: arr
  8. Out[154]: array([ nan, nan, nan, 2.318 , 1.9022, 1.8574, 2.2378])

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

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

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

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

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

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