NumPy 通用函数(ufunc),代表“通用函数”,是一类用于对 ndarray
对象进行逐元素运算的高性能函数。ufunc 使 NumPy 能够在底层高效地利用 C 语言实现向量化操作,从而显著提高计算速度。
ufunc 的主要优势体现在以下几个方面:
向量化操作: ufunc 可以对整个数组进行逐元素运算,避免了使用循环语句遍历每个元素的低效率操作。
广播机制: ufunc 支持广播机制,能够自动将不同形状的数组广播为相同形状,方便进行运算。
多种函数类型: ufunc 包含了丰富的数学运算、逻辑运算和比较运算等,涵盖了常见的数据处理需求。
灵活扩展: ufunc 支持自定义函数,可以根据需求创建新的 ufunc 来满足特定场景的运算需求。
向量化: 将原本需要使用循环语句逐个处理元素的操作,改为对整个数组进行操作,称为向量化。
广播: 在 NumPy 中,运算符可以对不同形状的数组进行运算,规则是将数组广播为相同的形状,具体规则由数组的维度和 shape
属性决定。
使用循环:
import numpy as np
x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])
z = []
for i, j in zip(x, y):
z.append(i + j)
print(z)
使用 ufunc:
import numpy as np
x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])
z = np.add(x, y)
print(z)
解释:
zip()
函数将 x
和 y
数组中的元素一一对应,并使用 append()
函数将计算结果存储在 z
列表中。np.add()
函数对 x
和 y
数组进行加法运算,并将结果存储在 z
数组中。ufunc 的优势在于,它可以避免使用循环语句,直接对整个数组进行操作,效率更高。
NumPy 允许用户创建自定义的 ufunc,以满足特定场景的运算需求。
步骤如下:
frompyfunc()
函数将自定义函数转换为 ufunc:
frompyfunc()
函数接收以下参数:
function
: 要转换的自定义函数。inputs
: 输入参数的数量。outputs
: 输出结果的数量。dtype
: 可选参数,指定输出数组的数据类型。示例:创建自定义加法函数 myadd
:
import numpy as np
def myadd(x, y):
return x + y
myadd = np.frompyfunc(myadd, 2, 1)
print(myadd([1, 2, 3, 4], [5, 6, 7, 8]))
解释:
myadd
函数定义了自定义的加法运算逻辑。np.frompyfunc()
将 myadd
函数转换为 ufunc,并指定其输入参数为 2 个,输出结果为 1 个。myadd
ufunc 对两个数组进行加法运算。可以使用 type()
函数检查函数的类型,如果结果为 numpy.ufunc
,则该函数是 ufunc。
import numpy as np
print(type(np.add))
import numpy as np
import time
# 1. 使用 ufunc 实现数组的平方和平方根运算
x = np.random.rand(10000)
## 最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:`Let us Coding`,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎点赞、收藏、关注