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

news/2025/3/16 14:44:41/文章来源:https://www.cnblogs.com/xiaowange/p/18234056

NumPy 通用函数(ufunc)

简介

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

优势

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

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

基本概念

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

示例

加法运算

使用循环:

import numpy as npx = 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 npx = 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 npdef myadd(x, y):return x + ymyadd = 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 npprint(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`,关注后即可获取最新文章推送看完如果觉得有帮助,欢迎点赞、收藏、关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/720585.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.28

python爬取 以软科中国最好大学排名为分析对象,基于requests库和bs4库编写爬虫程序,对2015年至2019年间的中国大学排名数据进行爬取:(1)按照排名先后顺序输出不同年份的前10位大学信息,并要求对输出结果的排版进行优化;(2)结合matplotlib库,对2015-2019年间前10位大学…

4.22

【题目描述】 假设一段楼梯共n(n>1)个台阶,小朋友一步最多能上3个台阶,那么小朋友上这段楼梯一共有多少种方法。【练习要求】请给出源代码程序和运行测试结果,源代码程序要求添加必要的注释。【输入格式】在一行中输入楼梯台阶的数目n。【输出格式】输出小朋友上这段楼梯…

SpringAMQP的工作队列WorkQueue

Work queue,工作队列,可以提高消息处理速度,避免队列消息堆积 模拟WorkQueue,实现一个队列绑定多个消费者 基本思路如下: 在publisher服务中定义测试方法,每秒产生50条消息,发送到simple.queue在consumer服务中定义两个消息监听者,都监听simple.queue队列一个消息监听者…

JCC

跳地址 JMP 修改eip的值,让程序下一步执行JMP修改EIP的地址 格式:JMP 寄存器/立即数==MOV EIP,寄存器/立即数 注:只影响EIP CALL PUSH 地址B MOV EIP,地址A/寄存器 ==CALL 地址A/寄存器 复制下一个地址,在修改EIP的值 eg:运行执行命令后,call下一个指令的地址入栈,ES…

crypto 入门

crypto1 看提示发现密文形式很像flag,加上后面有一个倒序,发现密文倒过来就是flagcrypto2 打开是一段加密文本,先用浏览器的控制台试试,按住F12打开控制台,复制,enter,就有了crypto3打开是一段颜文字,试试用AAencode解密,crypto4 题目要求我们计算d的值,根据RSA算法的…

实验20-智能换脸

changeface.pyimport cv2 import dlib import numpy import sysPREDICTOR_PATH = "./shape_predictor_68_face_landmarks.dat" SCALE_FACTOR = 1 FEATHER_AMOUNT = 11 # 代表各个区域的关键点标号 FACE_POINTS = list(range(17, 68)) MOUTH_POINTS = list(range(48, …

在线编辑涉密的Word文档,只读/禁止编辑/禁止复制/禁止另存/禁止打印

在日常办公环境中,保密信息的安全性是至关重要的,我们经常会需要在线预览编辑涉密的Word文档,但是又要求这些涉密的文档只能看,只读打开/禁止编辑/禁止复制/禁止另存/禁止打印,这时候该如何实现呢?猿大师办公助手可以帮您做到这些!猿大师办公助手可以把本地微软Office或…

实验19-使用keras完成语音识别

wavs_to_model.pyimport wave import numpy as np import osimport keras from keras.models import Sequential from keras.layers import Densenum_class = 0 # 加载的语音文件有几种类别 labsIndName=[] ## 训练集标签的名字 ["seven","stop"]# …

使用Wesky.Net.Opentools库,一行代码实现实体类类型转换为Json格式字符串

安装1.0.10以及以上版本的 Wesky.Net.OpenTools 包 包内,该功能的核心代码如下: 自定义属性:实体类JSON模式生成器: 使用方式:引用上面的1.0.10版本或以上的包。如果实体类有特殊需求,例如映射为其他名称,可以用OpenJson属性来实现。实体类对象案例如下:上面实体类,…

RFS_Server_06 上传并发布数据

操作描述:云服务器Ubuntu20.04系统Docker中有两个容器:Postgres容器和GeoServer容器。将数据存储至Postgres数据库容器中,并通过GeoServer连接,发布地图服务。 此文档中使用的Postgres数据库名称为pg01,GeoServer服务器名称为geoserver01。 1 基础操作:使用工具连接云…

vivado与modelsim联合仿真

写在前面:联合仿真需要版本对应,我的2020的modelsim和2020的vivado是可以用的。如果不对应,下边会编译报错。 第一步,编译仿真库文件。点击菜单栏Tools-->Compile Sim Libary,第一行Simulator选择Modelsim接下来Family选择你需要的器件对应的Family。Compiled library …

深度学习--风格迁移 原理以及实现--84

目录1. 简介4. 损失函数 参考链接:https://blog.csdn.net/ssshyeong/article/details/127092354 1. 简介 Image Style Transfer Using Convolutional Neural Networks:Gram矩阵(CVPR2016) 链接 Texture Synthesis Using Convolutional Neural Networks 图像经过卷积层后得到的…