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

NumPy 通用函数(ufunc)

简介

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

优势

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

向量化操作: ufunc 可以对整个数组进行逐元素运算,避免了使用循环语句遍历每个元素的低效率操作。

广播机制: ufunc 支持广播机制,能够自动将不同形状的数组广播为相同形状,方便进行运算。

多种函数类型: ufunc 包含了丰富的数学运算、逻辑运算和比较运算等,涵盖了常见的数据处理需求。

灵活扩展: ufunc 支持自定义函数,可以根据需求创建新的 ufunc 来满足特定场景的运算需求。

基本概念

向量化: 将原本需要使用循环语句逐个处理元素的操作,改为对整个数组进行操作,称为向量化。

广播: 在 NumPy 中,运算符可以对不同形状的数组进行运算,规则是将数组广播为相同的形状,具体规则由数组的维度和 shape 属性决定。

示例

加法运算

使用循环:

python 复制代码
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:

python 复制代码
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

python 复制代码
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。

python 复制代码
import numpy as np

print(type(np.add))

练习

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

解决方案

python 复制代码
import numpy as np
import time

# 1. 使用 ufunc 实现数组的平方和平方根运算

x = np.random.rand(10000)

## 最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:`Let us Coding`,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注
相关推荐
m0_46460826几秒前
监控 Linux 服务器资源
linux
在未来等你几秒前
Kafka面试精讲 Day 7:消息序列化与压缩策略
大数据·分布式·面试·kafka·消息队列
一乐小哥1 分钟前
一口气同步10年豆瓣记录———豆瓣书影音同步 Notion分享 🚀
后端·python
在未来等你1 分钟前
Kafka面试精讲 Day 10:事务机制与幂等性保证
大数据·分布式·面试·kafka·消息队列
tongsound4 分钟前
ros2 lifcycle介绍
linux·c++
袁煦丞4 分钟前
宝塔FTP远程文件管理+安全防护:cpolar内网穿透实验室第417个成功挑战
前端·程序员·远程工作
☆璇8 分钟前
【Linux】Linux环境基础开发工具使用
linux·运维·服务器
沐怡旸8 分钟前
【算法--链表】109.有序链表转换二叉搜索树--通俗讲解
算法·面试
华研前沿标杆游学11 分钟前
华为在国内搞的研发基地有多野?标杆游学带你解锁“研发界顶流”
python
小胖墩有点瘦15 分钟前
【基于深度学习的中草药识别系统】
人工智能·python·深度学习·课程设计·计算机毕业设计·中草药识别