- 通用函数,也可以称为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([ 0.64281682, 1.34063891, 0.65456202, -0.96088877, 2.16993944,
0.1304867 , 0.57337087, -0.26709099])
>>> y
array([ 0.42610606, -0.49656833, -1.04648181, -2.03357381, -0.84120672,
1.68150184, 0.46858646, 0.55915863])
>>> np.maximum(x,y)
array([ 0.64281682, 1.34063891, 0.65456202, -0.96088877, 2.16993944,
1.68150184, 0.57337087, 0.55915863])
- 这里,numpy.maximum逐个元素地将x和y中元素的最大值计算出来。
- 也有一些通用函数返回多个数组。比如modf,是Python内建函数divmod的向量化版本。它返回了一个浮点值数组的小数部分和整数部分:
>>> arr = np.random.randn(7) * 5
>>> arr
array([-1.51520888, 1.2907538 , -4.55419127, -4.77484185, -4.09394842,
-3.74836689, -4.87858508])
>>> remainder,whole_part = np.modf(arr)
>>> remainder
array([-0.51520888, 0.2907538 , -0.55419127, -0.77484185, -0.09394842,
-0.74836689, -0.87858508])
>>> whole_part
array([-1., 1., -4., -4., -4., -3., -4.])
- 通用函数接收一个可选参数out,运行对数组按位置操作:
>>> arr
array([-1.51520888, 1.2907538 , -4.55419127, -4.77484185, -4.09394842,
-3.74836689, -4.87858508])
>>> np.sqrt(arr)
<stdin>:1: RuntimeWarning: invalid value encountered in sqrt
array([ nan, 1.13611346, nan, nan, nan,
nan, nan])
>>> np.sqrt(arr,arr)
array([ nan, 1.13611346, nan, nan, nan,
nan, nan])
>>> arr
array([ nan, 1.13611346, nan, nan, nan,
nan, nan])
- 下图列举的是可用的通用函数:
![在这里插入图片描述](https://img-blog.csdnimg.cn/bad20ab631214f4c9f1116d043ed9059.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RyaXVtcGgxOQ==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/3088c6c137284bbab9cdaa5761fe448b.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RyaXVtcGgxOQ==,size_16,color_FFFFFF,t_70)