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 个。- 最后,调用
myadd
ufunc 对两个数组进行加法运算。
判断函数是否是 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 ...
随机推荐
- iOS自动化打包命令xcodebuild大全
iOS实现自动化打包已经稳定运营几年了,不同的场景用到xcodebuild命令不一样,有的参数可能一直都用不到,列举一些常用的命令,比如编译命令: xcodebuild archive -worksp ...
- 使用Oracle SQL Developer工具完成Mariadb数据库迁移到Oracle数据库
Oracle SQL Developer 是一个免费的集成开发环境,简化了传统部署和云部署中 Oracle 数据库的开发和管理.SQL Developer 提供完整的端到端的 PL/SQL 应用开发, ...
- 力扣176(MySQL)-第二高的薪水(中等)
题目: id 是这个表的主键.表的每一行包含员工的工资信息. 编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 .如果不存在第二高的薪水,查询应该返回 null . 查询结果如下 ...
- 力扣14(java)-最长公共前缀(简单)
题目: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入:strs = ["flower"," ...
- 真正的HTAP对用户和开发者意味着什么?
简介: Gartner 2016 年首次提出 HTAP(Hybrid Transaction / Analytical Processing,混合事务分析处理)并给出明确的定义:即同时支持 OLTP ...
- 大模型 RAG 是什么
大模型 RAG(Retrieval-Augmented Generation)是一种结合了检索(Retrieval)与生成(Generation)能力的先进人工智能技术,主要用于增强大型语言模型(LL ...
- ESP32 + IDF + LED
一.开发板 ESP32-S3-DevKitC-1 管脚布局 由于这个程序控制比较简单,就不赘述了,直接看程序. 二.程序 #include "freertos/FreeRTOS.h" ...
- STLINK/V2下载器接线方法
一.ST-LINK ST-LINK产品如下图所示: ST-LINK接口定义如下图所示 ST-LINK与stm32接线 使用SW接法只需要四根线: STM32 ST-LINK VCC(3.3V) TVC ...
- Asp .Net Core 系列:国际化多语言配置
目录 概述 术语 本地化器 IStringLocalizer 在服务类中使用本地化 IStringLocalizerFactory IHtmlLocalizer IViewLocalizer 资源文件 ...
- mybatis插件generator使用生成错误问题Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate failed: Exception getting JDBC Driver
使用插件除了其他回答的路径等问题,我遇到的把jar版本换一下就成了 把5点几的换成8点几的就好使了