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

NumPy 通用函数(ufunc)

简介

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

优势

ufunc 的主要优势体现在以下几个方面:

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

基本概念

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

示例

加法运算

使用循环:

1import numpy as np 2 3x = np.array([1, 2, 3, 4]) 4y = np.array([5, 6, 7, 8]) 5 6z = [] 7for i, j in zip(x, y): 8 z.append(i + j) 9 10print(z)

使用 ufunc:

1import numpy as np 2 3x = np.array([1, 2, 3, 4]) 4y = np.array([5, 6, 7, 8]) 5 6z = np.add(x, y) 7print(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

1import numpy as np 2 3def myadd(x, y): 4 return x + y 5 6myadd = np.frompyfunc(myadd, 2, 1) 7 8print(myadd([1, 2, 3, 4], [5, 6, 7, 8]))

解释:

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

判断函数是否是 ufunc

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

1import numpy as np 2 3print(type(np.add))

练习

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

解决方案

1import numpy as np 2import time 3 4# 1. 使用 ufunc 实现数组的平方和平方根运算 5 6x = np.random.rand(10000) 7 8## 最后 9 10为了方便其他设备和平台的小伙伴观看往期文章: 11 12微信公众号搜索:`Let us Coding`,关注后即可获取最新文章推送 13 14看完如果觉得有帮助,欢迎点赞、收藏、关注
点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

PYTHON 数据分析常用类库

numpy科学计算的基础包(1)快速高效多维的数组对象ndarray(2)对数组执行元素级的计算以及直接对数组执行数学运算的函数(3)读写硬盘上基于数组的数据集的工具(4)线性代数运算,傅里叶变换,以及随机数生成(5)将C、C、Fortran代码集成到pythonscipy专门解决科学计算中各种标准问题域的模块的集合

NumPy:数组批量计算

一、MumPy:数组计算1、NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础。2、NumPy的主要功能:ndarray,一个多维数组结构,高效且节省空间无需循环对整组数据进行快速运算的数学函数\读写磁盘数据的工具以及用于操作内存映射文件的工具\

Python数据分析

1.numpy\支持多维数组与矩阵的科学计算器包功能:常用功能16条a.ndarrayn维数组/矢量的操作。b. 支持高级大量的n维数组与矩阵的运算。c.针对数组运算提供大量的数学函数库。2.scipy\配合numpy完成对矩阵的计算,因此依赖于numpy,且含多个子模块功能:常用15个函数a. 标准导

NumPy 数组创建方法与索引访问详解

NumPy创建数组NumPy中的核心数据结构是ndarray,它代表多维数组。NumPy提供了多种方法来创建ndarray对象,包括:使用array()函数array()函数是最常用的方法之一,它可以将Python列表、元组甚至其他数组转换为ndarray

NumPy 数组迭代与合并详解

NumPy数组迭代NumPy数组迭代是访问和处理数组元素的重要方法。它允许您逐个或成组地遍历数组元素。基本迭代我们可以使用Python的基本for循环来迭代NumPy数组。一维数组迭代:pythonimportnumpyasnparrnp.array(1