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


    NumPy 通用函数(ufunc)

    简介

    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() 函数将 xy 数组中的元素一一对应,并使用 append() 函数将计算结果存储在 z 列表中。
    • 在第二个示例中,直接使用 np.add() 函数对 xy 数组进行加法运算,并将结果存储在 z 数组中。

    ufunc 的优势在于,它可以避免使用循环语句,直接对整个数组进行操作,效率更高。

    创建自定义 ufunc

    NumPy 允许用户创建自定义的 ufunc,以满足特定场景的运算需求。

    步骤如下:

    1. 定义要封装的运算函数:
      • 函数应接收任意数量的 ndarray 数组作为输入参数。
      • 函数应返回一个或多个 ndarray 数组作为输出结果。
    2. 使用 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 对两个数组进行加法运算。

    判断函数是否是 ufunc

    可以使用 type() 函数检查函数的类型,如果结果为 numpy.ufunc,则该函数是 ufunc。

    import numpy as np
    
    print(type(np.add))
    '
    运行

    练习

    1. 使用 ufunc 实现数组的平方和平方根运算。
    2. 创建自定义 ufunc,用于计算两个数组的元素之积并返回最大值。
    3. 比较使用 ufunc 和循环语句进行数组运算的性能差异。

    解决方案

    import numpy as np
    import time
    
    # 1. 使用 ufunc 实现数组的平方和平方根运算
    
    x = np.random.rand(10000)
    
    ## 最后
    
    为了方便其他设备和平台的小伙伴观看往期文章:
    
    微信公众号搜索:`Let us Coding`,关注后即可获取最新文章推送
    
    看完如果觉得有帮助,欢迎点赞、收藏、关注
    
  • 相关阅读:
    2022年区块链金融场景化应用专题分析
    Mac VsCode g++编译报错:不支持C++11语法解决
    【Python之正则表达式与JSON】
    技术分享 | 接口自动化测试之JSON Schema模式该如何使用?
    搭建Github图床
    PowerCLi 一键批量部署OVA 到esxi 7
    html5期末大作业:基于HTML+CSS技术实现——传统手工艺术雕刻网站(3页)
    EMNLP 2022 | SentiWSP: 基于多层级的情感感知预训练模型
    OJ练习第169题——课程表 IV
    Spectacle/Flameshot/X11 Xlib截屏问题现象及解决方法
  • 原文地址:https://blog.csdn.net/2302_76489021/article/details/139483695