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()函数将x和y数组中的元素一一对应,并使用append()函数将计算结果存储在z列表中。 - 在第二个示例中,直接使用
np.add()函数对x和y数组进行加法运算,并将结果存储在z数组中。
ufunc 的优势在于,它可以避免使用循环语句,直接对整个数组进行操作,效率更高。
创建自定义 ufunc
NumPy 允许用户创建自定义的 ufunc,以满足特定场景的运算需求。
步骤如下:
- 定义要封装的运算函数:
- 函数应接收任意数量的 ndarray 数组作为输入参数。
- 函数应返回一个或多个 ndarray 数组作为输出结果。
- 使用
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 个。- 最后,调用
myaddufunc 对两个数组进行加法运算。
判断函数是否是 ufunc
可以使用 type() 函数检查函数的类型,如果结果为 numpy.ufunc,则该函数是 ufunc。
import numpy as np
print(type(np.add))
练习
- 使用 ufunc 实现数组的平方和平方根运算。
- 创建自定义 ufunc,用于计算两个数组的元素之积并返回最大值。
- 比较使用 ufunc 和循环语句进行数组运算的性能差异。
解决方案
import numpy as np
import time
# 1. 使用 ufunc 实现数组的平方和平方根运算
x = np.random.rand(10000)
## 最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:`Let us Coding`,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎点赞、收藏、关注
NumPy 通用函数(ufunc):高性能数组运算的利器的更多相关文章
- Numpy学习三:数组运算
1.转置 #reshape(shape)函数改变数组形状,shape是一个元组,表示数组的形状 创建一个包含15个元素的一维数组,通过reshape函数调整数组形状为3行5列的二维数组arr = np ...
- 1-Numpy的通用函数(ufunc)
一.numpy“通用函数”(ufunc)包括以下几种: 元素级函数(一元函数):对数组中的每个元素进行运算 数组级函数:统计函数,像聚合函数(例如:求和.求平均) 矩阵运算 随机生成函数 常用一元通用 ...
- numpy之通用函数ufunc
通用函数-元素级数组函数 通用函数(ufunc)是一种对ndarray执行元素级运算的函数. 一元ufunc import numpy as np arr = np.arange(-10,10,2) ...
- numpy通用函数
numpy的通用函数可以对数组进行向量化操作,可以提高数组元素的重复计算的效率. 一.numpy的算数运算符都是对python内置符的封装 算数运算符 >>> import nump ...
- Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】
目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...
- Numpy数值类型与数值运算-03
什么是NumPy? NumPy是Python中科学计算的基本软件包.它是一个Python库,提供多维数组对象,各种派生对象(例如蒙版数组和矩阵) 以及各种例程,用于对数组进行快速操作,包括数学,逻辑, ...
- Python数据分析 | Numpy与1维数组操作
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/33 本文地址:http://www.showmeai.tech/article-det ...
- IDL 数组运算
1.求大.求小和求余 IDL> arr=indgen(4) IDL> print,arr 0 1 2 3 IDL> print,arr>3 3 3 3 3 IDL> pr ...
- JavaScript 高性能数组去重
中午和同事吃饭,席间讨论到数组去重这一问题 我立刻就分享了我常用的一个去重方法,随即被老大指出这个方法效率不高 回家后我自己测试了一下,发现那个方法确实很慢 于是就有了这一次的高性能数组去重研究 一. ...
- C#编程(七十六)----------使用指针实现基于栈的高性能数组
使用指针实现基于栈的高性能数组 以一个案例为主来分析实现方法: using System; using System.Collections.Generic; using System.Linq; u ...
随机推荐
- 顺通家用电器生产工厂ERP管理系统
顺通家用电器生产工厂ERP管理系统是一款面向中小制造企业,以智能制造与精益管理为核心的一体化管理软件,符合行业特性的管理流程,与经营特征,形成行业化管理应用软件,为企业提供各方面信息化的管理应用与支持 ...
- easyx的使用,鼠标交互(3.0)
本文从B站学习,借鉴: 学习视频地址:鼠标操作(旧版)_哔哩哔哩_bilibili
- 【SQL】将日期时间转换成年月日的日期形式
[SQL]将日期时间转换成年月日的日期形式 这段时间写力扣的SQL题,发现了各式各样的转换时间的方法,正好记录一下 TO_CHAR(XXX,'YYYY-MM-DD') 这个在Oracle应该是很常用的 ...
- 我,PolarDB云原生数据库,5年来实现这些重磅技术创新
简介: 过去5年,阿里云针对PolarDB进行了诸多创新,通过采用存储计算分离.软硬一体化设计,PolarDB实现成本仅为传统商业数据库的十分之一.所实现的计算.内存与存储资源的"三层解耦& ...
- Serverless 时代下大规模微服务应用运维的最佳实践
简介: 原来的微服务用户需要自建非常多的组件,包括 PaaS 微服务一些技术框架,运维 IaaS.K8s,还包括可观测组件等.SAE 针对这些方面都做了整体的解决方案,使用户只需要关注自己的业务系统, ...
- 剑指企业级云原生,阿里云 CNFS 如何破局容器持久化存储困境
简介: 云原生趋势下,应用容器化比例正在快速增长,Kubernetes 也已成为云原生时代新的基础设施. 据 Forrester 预测,到 2022 年, 全球企业及组织在生产环境运行容器化应用.观察 ...
- OpenKruise 如何实现应用的可用性防护?
简介: OpenKruise 在 2021.9.6 发布了最新的 v0.10.0 版本新增了弹性拓扑管理和应用安全防护等能力,本文将为大家揭晓 OpenKruise 是如何实现应用的可用性防护能力. ...
- OpenKruise v0.10.0 新特性 WorkloadSpread 解读
简介: 针对需求,OpenKruise 在 v0.10.0 版本中新增了 WorkloadSpread 特性.目前它支持配合 Deployment.ReplicaSet.CloneSet 这些 wo ...
- WinDbg 设置在加载到某个 DLL 进入断点
本文记录如何在 WinDbg 里,设置在加载到某个 DLL 时,自动进入断点.通过此方式用来定位是哪个业务模块加载了某个 DLL 模块 在 WinDbg 里面,可以附加到现有进程,也可以启动某个进程. ...
- WPF 获取全局所有窗口的创建显示事件 监控窗口打开
本文将告诉大家如何在 WPF 里面进行全局监控任意的窗口创建显示打开,可以获取到每个 WPF 窗口的打开的时机.如此可以用来辅助定位问题和输出日志 这篇博客是有背景的,老司机告诉我说他的应用不响应鼠标 ...