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 ...
随机推荐
- Oracle sql 判断全角字符
(lengthb(MC) - length(MC))<>(lengthb(to_single_byte(MC)) - length(to_single_byte(MC)))
- 力扣429(java)-构造矩形(简单)
题目: 作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的. 所以,现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面.要求: 你设计的矩 ...
- MAE 自监督算法介绍和基于 EasyCV 的复现
简介:自监督学习(Self-Supervised Learning)能利用大量无标注的数据进行表征学习,然后在特定下游任务上对参数进行微调.通过这样的方式,能够在较少有标注数据上取得优于有监督学习方 ...
- 数据湖揭秘—Delta Lake
简介:Delta Lake 是 DataBricks 公司开源的.用于构建湖仓架构的存储框架.能够支持 Spark,Flink,Hive,PrestoDB,Trino 等查询/计算引擎.作为一个开放 ...
- ACK One 构建应用系统的两地三中心容灾方案
简介:本文侧重介绍了通过 ACK One 的多集群应用分发功能,可以帮助企业管理多集群环境,通过多集群主控示例提供的统一的应用下发入口,实现应用的多集群分发,差异化配置,工作流管理等分发策略.结合 ...
- 使用 rocketmq-spring-boot-starter 来配置、发送和消费 RocketMQ 消息
简介: 本文将 rocktmq-spring-boot 的设计实现做一个简单的介绍,读者可以通过本文了解将 RocketMQ Client 端集成为 spring-boot-starter 框架的开发 ...
- V8 编译浅谈
简介:本文是一个 V8 编译原理知识的介绍文章,旨在让大家感性的了解 JavaScript 在 V8 中的解析过程. 作者 | 子弈 来源 | 阿里技术公众号 一 简介 本文是一个 V8 编译原 ...
- 七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
前言 上一章节我们引入BootstrapBlazor UI组件完成了EasySQLite后台界面的基本架子的搭建,本章节的主要内容是Blazor班级管理页面编写和接口对接. 七天.NET 8 操作 S ...
- WPF 界面打不开提示 System.ArithmeticException Overflow or underflow in the arithmetic operation 异常
本文告诉大家如何解决界面打不开,抛出 System.ArithmeticException: Overflow or underflow in the arithmetic operation 异常的 ...
- Part-DB 配置流程
介绍 Part-DB是一个开源的器件管理工具,博主用于管理个人的电子器材,最近捣鼓了一下这个工具,由于手头还有一块闲置的赛昉·星光2的开发板,所以我打算一起拿来捣鼓一下,如果不成功,就用树莓派(生气) ...