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

小万哥
• 阅读 255

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 和循环语句进行数组运算的性能差异。

解决方案

```python import numpy as np import time

1. 使用 ufunc 实现数组的平方和平方根运算

x = np.random.rand(10000)

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
PYTHON 数据分析常用类库
numpy科学计算的基础包(1)快速高效多维的数组对象ndarray(2)对数组执行元素级的计算以及直接对数组执行数学运算的函数(3)读写硬盘上基于数组的数据集的工具(4)线性代数运算,傅里叶变换,以及随机数生成(5)将C、C、Fortran代码集成到pythonscipy专门解决科学计算中各种标准问题域的模块的集合
Stella981 Stella981
3年前
NumPy:数组批量计算
一、MumPy:数组计算1、NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础。2、NumPy的主要功能:ndarray,一个多维数组结构,高效且节省空间无需循环对整组数据进行快速运算的数学函数\读写磁盘数据的工具以及用于操作内存映射文件的工具\
Stella981 Stella981
3年前
Python数据分析
1.numpy\支持多维数组与矩阵的科学计算器包功能:常用功能16条a.ndarrayn维数组/矢量的操作。b. 支持高级大量的n维数组与矩阵的运算。c.针对数组运算提供大量的数学函数库。2.scipy\配合numpy完成对矩阵的计算,因此依赖于numpy,且含多个子模块功能:常用15个函数a. 标准导
小万哥 小万哥
6个月前
NumPy 数组迭代与合并详解
NumPy数组迭代NumPy数组迭代是访问和处理数组元素的重要方法。它允许您逐个或成组地遍历数组元素。基本迭代我们可以使用Python的基本for循环来迭代NumPy数组。一维数组迭代:pythonimportnumpyasnparrnp.array(1
小万哥 小万哥
6个月前
NumPy 数组排序、过滤与随机数生成详解
NumPy数组排序排序数组排序数组意味着将元素按特定顺序排列。顺序可以是数字大小、字母顺序、升序或降序等。NumPy的ndarray对象提供了一个名为sort()的函数,用于对数组进行排序。示例:pythonimportnumpyasnparrnp.arr
小万哥 小万哥
5个月前
NumPy 简单算术:加减乘除及其他运算
NumPy中的简单算术运算可以通过add,subtract,multiply,divide,power,mod,remainder等函数实现,这些函数支持条件运算,并接受where参数。例如,add()实现加法,subtract()表示减法,multiply()是乘法,divide()用于除法,power()提升到幂次,mod()和remainder()计算余数。absolute()或abs()可以计算数组元素的绝对值。这些函数可用于数组或类似数组对象,返回新数组存储运算结果。
小万哥 小万哥
5个月前
NumPy 舍入小数、对数、求和和乘积运算详解
NumPy提供五种舍入小数的方法:trunc(),fix(),around(),floor(),ceil()。此外,它还支持对数运算,如log2(),log10(),log(),以及自定义底数的对数。NumPy的sum()和prod()函数用于数组求和与乘积,可指定轴进行计算,cumsum()和cumprod()实现累积求和与乘积。关注公众号"LetusCoding"获取更多内容。
小万哥 小万哥
3个月前
Kotlin 循环与函数详解:高效编程指南
Kotlin中的循环结构让你能轻松遍历数组或范围内的元素。使用for循环结合in操作符,可以简洁地访问数组中的每个项,如字符串数组或整数数组。对于范围,可以用..来定义一系列连续的值并进行迭代。此外,Kotlin支持通过break和continue控制循环流程。函数则允许封装可复用的代码块,你可以定义接受参数并返回值的函数,利用简写语法使代码更加紧凑。例如,myFunction(x:Int,y:Int)xy简洁地定义了一个计算两数之和的函数。
小万哥 小万哥
6个月前
学会使用 NumPy:基础、随机、ufunc 和练习测试
NumPyNumPy是一个用于处理数组的Python库。它代表“NumericalPython”。基本随机ufunc通过测验测试学习检验您对NumPy的掌握程度。通过练习学习NumPy练习练习:请插入创建NumPy数组的正确方法。pythonarrnp.(
小万哥 小万哥
6个月前
NumPy 数组创建方法与索引访问详解
NumPy创建数组NumPy中的核心数据结构是ndarray,它代表多维数组。NumPy提供了多种方法来创建ndarray对象,包括:使用array()函数array()函数是最常用的方法之一,它可以将Python列表、元组甚至其他数组转换为ndarray