NumPy 通用函数(ufunc):高性能数组运算的利器

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

NumPy 通用函数(ufunc)

简介

NumPy 通用函数(ufunc),代表“通用函数”,是一类用于对 ndarray 对象进行逐元素运算的高性能函数。ufunc 使 NumPy 能够在底层高效地利用 C 语言实现向量化操作,从而显著提高计算速度。
上风

ufunc 的主要上风体如今以下几个方面:
向量化操作: ufunc 可以对整个数组进行逐元素运算,避免了使用循环语句遍历每个元素的低效率操作。
广播机制: ufunc 支持广播机制,能够自动将不同形状的数组广播为相同形状,方便进行运算。
多种函数类型: ufunc 包含了丰富的数学运算、逻辑运算和比较运算等,涵盖了常见的数据处置处罚需求。
灵活扩展: ufunc 支持自界说函数,可以根据需求创建新的 ufunc 来满足特定场景的运算需求。
根本概念

向量化: 将原本需要使用循环语句逐个处置处罚元素的操作,改为对整个数组进行操作,称为向量化。
广播: 在 NumPy 中,运算符可以对不同形状的数组进行运算,规则是将数组广播为相同的形状,具体规则由数组的维度和 shape 属性决定。
示例

加法运算

使用循环:
  1. import numpy as np
  2. x = np.array([1, 2, 3, 4])
  3. y = np.array([5, 6, 7, 8])
  4. z = []
  5. for i, j in zip(x, y):
  6.     z.append(i + j)
  7. print(z)
复制代码
使用 ufunc:
  1. import numpy as np
  2. x = np.array([1, 2, 3, 4])
  3. y = np.array([5, 6, 7, 8])
  4. z = np.add(x, y)
  5. print(z)
复制代码
解释:

  • 在第一个示例中,使用 zip() 函数将 x 和 y 数组中的元素一一对应,并使用 append() 函数将计算结果存储在 z 列表中。
  • 在第二个示例中,直接使用 np.add() 函数对 x 和 y 数组进行加法运算,并将结果存储在 z 数组中。
ufunc 的上风在于,它可以避免使用循环语句,直接对整个数组进行操作,效率更高。
创建自界说 ufunc

NumPy 答应用户创建自界说的 ufunc,以满足特定场景的运算需求。
步骤如下:

  • 界说要封装的运算函数:

    • 函数应接收任意数量的 ndarray 数组作为输入参数。
    • 函数应返回一个或多个 ndarray 数组作为输出结果。

  • 使用 frompyfunc() 函数将自界说函数转换为 ufunc:

    • frompyfunc() 函数接收以下参数:

      • function: 要转换的自界说函数。
      • inputs: 输入参数的数量。
      • outputs: 输出结果的数量。
      • dtype: 可选参数,指定输出数组的数据类型。


示例:创建自界说加法函数 myadd:
  1. import numpy as np
  2. def myadd(x, y):
  3.     return x + y
  4. myadd = np.frompyfunc(myadd, 2, 1)
  5. print(myadd([1, 2, 3, 4], [5, 6, 7, 8]))
复制代码
解释:

  • myadd 函数界说了自界说的加法运算逻辑。
  • np.frompyfunc() 将 myadd 函数转换为 ufunc,并指定其输入参数为 2 个,输出结果为 1 个。
  • 末了,调用 myadd ufunc 对两个数组进行加法运算。
判定函数是否是 ufunc

可以使用 type() 函数检查函数的类型,如果结果为 numpy.ufunc,则该函数是 ufunc。
  1. import numpy as np
  2. print(type(np.add))
复制代码
练习


  • 使用 ufunc 实现数组的平方宁静方根运算。
  • 创建自界说 ufunc,用于计算两个数组的元素之积并返回最大值。
  • 比较使用 ufunc 和循环语句进行数组运算的性能差别。
办理方案
  1. import numpy as np
  2. import time
  3. # 1. 使用 ufunc 实现数组的平方和平方根运算
  4. x = np.random.rand(10000)
  5. ## 最后
  6. 为了方便其他设备和平台的小伙伴观看往期文章:
  7. 微信公众号搜索:`Let us Coding`,关注后即可获取最新文章推送
  8. 看完如果觉得有帮助,欢迎点赞、收藏、关注
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表