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() 函数将 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 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))

练习

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

解决方案

import numpy as np
import time # 1. 使用 ufunc 实现数组的平方和平方根运算 x = np.random.rand(10000) ## 最后 为了方便其他设备和平台的小伙伴观看往期文章: 微信公众号搜索:`Let us Coding`,关注后即可获取最新文章推送 看完如果觉得有帮助,欢迎点赞、收藏、关注

NumPy 通用函数(ufunc):高性能数组运算的利器的更多相关文章

  1. Numpy学习三:数组运算

    1.转置 #reshape(shape)函数改变数组形状,shape是一个元组,表示数组的形状 创建一个包含15个元素的一维数组,通过reshape函数调整数组形状为3行5列的二维数组arr = np ...

  2. 1-Numpy的通用函数(ufunc)

    一.numpy“通用函数”(ufunc)包括以下几种: 元素级函数(一元函数):对数组中的每个元素进行运算 数组级函数:统计函数,像聚合函数(例如:求和.求平均) 矩阵运算 随机生成函数 常用一元通用 ...

  3. numpy之通用函数ufunc

    通用函数-元素级数组函数 通用函数(ufunc)是一种对ndarray执行元素级运算的函数. 一元ufunc import numpy as np arr = np.arange(-10,10,2) ...

  4. numpy通用函数

    numpy的通用函数可以对数组进行向量化操作,可以提高数组元素的重复计算的效率. 一.numpy的算数运算符都是对python内置符的封装 算数运算符 >>> import nump ...

  5. Numpy 笔记: 多维数组的切片(slicing)和索引(indexing)【转】

    目录 切片(slicing)操作 索引(indexing) 操作 最简单的情况 获取多个元素 切片和索引的同异 切片(slicing)操作 Numpy 中多维数组的切片操作与 Python 中 lis ...

  6. Numpy数值类型与数值运算-03

    什么是NumPy? NumPy是Python中科学计算的基本软件包.它是一个Python库,提供多维数组对象,各种派生对象(例如蒙版数组和矩阵) 以及各种例程,用于对数组进行快速操作,包括数学,逻辑, ...

  7. Python数据分析 | Numpy与1维数组操作

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/33 本文地址:http://www.showmeai.tech/article-det ...

  8. IDL 数组运算

    1.求大.求小和求余 IDL> arr=indgen(4) IDL> print,arr 0 1 2 3 IDL> print,arr>3 3 3 3 3 IDL> pr ...

  9. JavaScript 高性能数组去重

    中午和同事吃饭,席间讨论到数组去重这一问题 我立刻就分享了我常用的一个去重方法,随即被老大指出这个方法效率不高 回家后我自己测试了一下,发现那个方法确实很慢 于是就有了这一次的高性能数组去重研究 一. ...

  10. C#编程(七十六)----------使用指针实现基于栈的高性能数组

    使用指针实现基于栈的高性能数组 以一个案例为主来分析实现方法: using System; using System.Collections.Generic; using System.Linq; u ...

随机推荐

  1. 腾讯音乐:说说Redis脑裂问题?

    Redis 脑裂问题是指,在 Redis 哨兵模式或集群模式中,由于网络原因,导致主节点(Master)与哨兵(Sentinel)和从节点(Slave)的通讯中断,此时哨兵就会误以为主节点已宕机,就会 ...

  2. 纯CSS实现带小三角提示框

    要实现在页面上点击指定元素时,弹出一个信息提示框.在前面的文章中,我们已经简单介绍了如何使用纯 CSS 创建一个三角形.本文在此基础上,记录如何使用 CSS 创建带三角形的提示框. 实现的原理是创建一 ...

  3. 力扣504(java)-七进制数(简单)

    题目: 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出. 示例 1: 输入: num = 100输出: "202"示例 2: 输入: num = -7输出: &qu ...

  4. 一文了解阿里一站式图计算平台GraphScope

    简介: 随着大数据的爆发,图数据的应用规模不断增长,现有的图计算系统仍然存在一定的局限.阿里巴巴拥有全球最大的商品知识图谱,在丰富的图场景和真实应用的驱动下,阿里巴巴达摩院智能计算实验室研发并开源了全 ...

  5. Win32 使用 CreateProcess 方法让任务管理器里的命令行不显示应用文件路径

    本文记录一个 Win32 的有趣行为,调用 CreateProcess 方法传入特别的参数,可以让任务管理器里的命令行不显示应用文件路径 开始之前,先看看下面这张有趣的图片 可以看到我编写的 Svca ...

  6. ES6中Promise方法详解

    概要 Promise是个保存异步结果的容器(对象). Promise的状态有:pending(进行中),fulfilled(已成功),rejected(已失败),对应其异步操作的状态. 状态转换: p ...

  7. openpyxl模块操作Excel

    1.openpyxl模块了解 1.excel版本问题 03版本之前的excel文件后缀名xls 03版本之后的excel文件后缀名xlsx 2.python操作excel表格的模块 openpyxl ...

  8. 几个ABAP FREE面试问题

    Text. Text. Text. Text. Text. 电话面试,有几个问题没有回答上.有些问题是此前完全不了解的,有些是学过但因为好久不用已经忘记.这里试着重新回答一下. 1,如何创建bapi? ...

  9. 程序员天天 CURD,怎么才能成长,职业发展的思考(2)

    接着上一篇:程序员天天 CURD,怎么才能成长,职业发展思考 上一篇写到了用年限来谈程序员的发展,在 4 - 6 年这个时间段需要做的一些事情,接着写这个时间段的. 第 4.5 年时候,你可能会做一些 ...

  10. SqlServer2008R2 在开始菜单中找不到配置管理器

    直接找到C:\Windows\SysWOW64\SQLServerManager10.msc,打开即可.