在NumPy中,可以通过numpy.vectorize()
函数来将函数应用于数组中的每个元素。具体如下:
- 定义一个将要应用于数组的函数
def my_function(x):
if x < 0:
return 0
else:
return x + 1
- 创建一个NumPy数组
import numpy as np
my_array = np.array([-1, 2, -3, 4, -5])
- 使用
numpy.vectorize()
函数创建一个新的向量化函数
my_vectorized_function = np.vectorize(my_function)
- 使用向量化函数将数组中的每个元素映射到一个新数组
new_array = my_vectorized_function(my_array)
print(new_array)
输出:[0 3 0 5 0]
通过numpy.vectorize()
函数实现函数映射的过程非常简单,但是需要注意以下几点:
-
向量化函数的效率比原始函数效率低,因为在每个元素上调用的函数已经被包装成一个新函数,并且需要额外的开销。
-
如果一个函数需要两个参数进行计算,则需使用
numpy.frompyfunc()
函数。
除了numpy.vectorize()
函数,NumPy提供了更高效的函数映射方式——使用数组的方法。也就是将函数定义成ufunc
(universal function,通用函数),可以在numpy中访问并且它的功能与numpy内置函数类似。下面将举例说明:
- 定义一个将要应用于数组的函数,加法函数可以转化为ufunc
def my_add(x, y):
return x + y
- 创建一个NumPy数组
import numpy as np
my_array = np.array([1, 2, 3])
- 将函数转化为
ufunc
my_ufunc = np.frompyfunc(my_add, 2, 1)
第一个参数是应用于该ufunc的函数,第二个参数指定ufunc的输入数目,第三个参数指定ufunc的输出数目。
- 使用ufunc将数组中的每个元素映射到一个新数组
new_array = my_ufunc(my_array, 2)
print(new_array)
输出:[3 4 5]
在这个例子中,我们同样通过定义函数和创建数组,但是这里用到的是将函数转化为ufunc
并直接在数组上运行的方法。ufunc
不仅是更高效的函数映射方式,还可以对多维数组进行操作。