当前位置:

首页 > 编程开发 > 如何使用Python中的numpy.ufunc函数?

如何使用Python中的numpy.ufunc函数?

一、说明numpy.ufunc是什么函数?答曰:就是numpy的函数,因为numpy针对的是数组张量,因此,几乎每一个函数都是ufunc。二、numpy.ufunc函数概念2.1numpy.ufunc简介在整个数组上逐个元素地操作的函数。因此,ufunc是个泛指,这些函数为数众多。通用函数(或简称ufunc)是一种以逐个元素的方式对ndarrays进行操作的函数,支持数组广播、类型转换和其他一些标准功能。也就是说,ufunc是函数的“矢量化”包装器,它采用固定数量的特定输入并产生固定数量的特定输出。有关通

本文目录

    一、说明

            numpy.ufunc是什么函数?答曰:就是numpy的函数,因为numpy针对的是数组张量,因此,几乎每一个函数都是ufunc。

    二、numpy.ufunc函数概念

    2.1 numpy.ufunc简介

            在整个数组上逐个元素地操作的函数。因此,ufunc是个泛指,这些函数为数众多。

            通用函数(或简称 ufunc)是一种以逐个元素的方式对 ndarrays 进行操作的函数,支持数组广播、类型转换和其他一些标准功能。也就是说,ufunc 是函数的“矢量化”包装器,它采用固定数量的特定输入并产生固定数量的特定输出。有关通用函数的详细信息,请参阅通用函数 (ufunc) 基础知识。

            在NumPy中,通函数是numpy.ufunc类的实例 。 许多内置函数都是在编译的C代码中实现的。 基本的ufuncs对标量进行操作,但也有一种通用类型,基本元素是子数组(向量,矩阵等), 广播是在其他维度上完成的。也可以ufunc使用frompyfuncopen in new window工厂函数生成自定义实例。

    2.2 numpy.ufunc.nin和numpy.ufunc.nout

            该函数表述出对应ufun函数的输入参数数量,如下列ufunc时对应的输入参数个数。

    np.add.nin
    2
    np.multiply.nin
    2
    np.power.nin
    2
    np.exp.nin
    2

             该函数表述出对应ufun函数的输出参数数量,如下列ufunc时对应的输入参数个数。

    np.add.nout
    1
    np.multiply.nout
    1
    np.power.nout
    1
    np.exp.nout
    1

    2.3 numpy.ufunc.nargs

    numpy.ufunc对应参数的个数,

    np.add.nargs
    3
    np.multiply.nargs
    3
    np.power.nargs
    3
    np.exp.nargs
    2

     如np.add函数有三个参数,两个输入,一个输出,如下:

    a = np.array([2,4,5,6])
    b = np.array([2,2,3,3])
    c = np.zeros((4,))
    np.add(  a,b,c )
    print( c )

    2.4  numpy.ufunc.ntypes

            表明一个ufunc的输入数据类型格式:ufunc 可以操作的数字 NumPy 类型的数量——总共有 18 种。

    np.add.ntypes
    18
    np.multiply.ntypes
    18
    np.power.ntypes
    17
    np.exp.ntypes
    7
    np.remainder.ntypes
    14

     2.5  numpy.ufunc.type

    np.add.types
    ['??->?', 'bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l',
    'LL->L', 'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D',
    'GG->G', 'OO->O']
    np.multiply.types
    ['??->?', 'bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l',
    'LL->L', 'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D',
    'GG->G', 'OO->O']
    np.power.types
    ['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L',
    'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G',
    'OO->O']
    np.exp.types
    ['f->f', 'd->d', 'g->g', 'F->F', 'D->D', 'G->G', 'O->O']
    np.remainder.types
    ['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L',
    'qq->q', 'QQ->Q', 'ff->f', 'dd->d', 'gg->g', 'OO->O']

    2.6 维度ndim和shape

            表明维度的参数有两个,array.ndim  和 array.shape,其中ndim是指张量共几个维度,shape是指每个维度下的向量长度。比如下例:

    x = np.array([1, 2, 3])
    print(x.ndim)
    print(x.shape)
     
    y = np.zeros((2, 3, 4))
    print(y.ndim)
    print(y.shape)

     结果:

    1
    (3,)
    3
    (2, 3, 4)

    三、ufunc的广播特性

            每个通函数接受数组输入并通过在输入上逐元素地执行核心功能来生成数组输出(其中元素通常是标量,但可以是用于广义ufunc的向量或更高阶子数组)。 应用标准广播规则,以便仍然可以有效地操作不共享完全相同形状的输入。 广播可以通过四个规则来理解:

    1. 所有输入数组都ndimopen in new window小于最大的输入数组,ndimopen in new window其形状前面有1个。

    2. 输出形状的每个维度的大小是该维度中所有输入大小的最大值。

    3. 如果输入在特定维度中的大小与该维度中的输出大小匹配,或者其值正好为1,则可以在计算中使用该输入。

    4. 如果输入的形状尺寸为1,则该维度中的第一个数据条目将用于沿该维度的所有计算。换句话说,ufuncopen in new window的步进机械 将不会沿着该维度步进(对于该维度,步幅将为0)。

            整个NumPy使用广播来决定如何处理不同形状的数组; 例如,所有算术运算(+, -,*之间,...)ndarraysopen in new window的数组操作之前广播。

            如果上述规则产生有效结果,则将一组数组称为“可广播”到相同的形状, 即 满足下列条件之一:

    • 数组都具有完全相同的形状。

    • 数组都具有相同的维数,每个维度的长度是公共长度或1。

    • 尺寸太小的数组可以使其形状前置为长度为1的尺寸以满足属性2。

            如果a.shape是 (5,1),b.shape是 (1,6),c.shape是 (6,)并且d.shape是 () 使得 d 是标量,则 a , b , c 和 d 都可以广播到维度 (5, 6); 和:

    • a 的作用类似于(5,6)数组,其中 [:, 0] 广播到其他列,

    • b 的作用类似于(5,6)数组,其中 b[0, :] 广播到其他行,

    • c 就像一个(1,6)数组,因此像一个(5,6)数组,其中 c[:] 广播到每一行,最后,

    • d 的作用类似于(5,6)数组,其中重复单个值。

    四、函数格式

            可以在通用函数 (ufunc) 的文档中找到有关 ufunc 的详细说明。

             调用ufuncs格式: 

            op( *x[, out], where=True, **kwargs)

    将 op 应用于参数 *x elementwise,广播参数。

    广播规则是:

    长度为 1 的维度可以添加到任一数组之前。

    数组可以沿长度为 1 的维度重复。

    参数:

            *xarray_like

            outndarray,None,或 ndarray 和 None 的元组,可选

            用于放置结果的备用数组对象;如果提供,它必须具有输入广播的形状。数组元组(可能仅作为关键字参数)的长度必须等于输出的数量;对 ufunc 分配的未初始化输出使用 None。

            wherearray_like,可选

            此条件通过输入广播。在条件为 True 的位置,out 数组将设置为 ufunc 结果。在其他地方,out 数组将保留其原始值。请注意,如果通过默认 out=None 创建未初始化的 out 数组,则其中条件为 False 的位置将保持未初始化状态。

    五、示例详解 

    5.1 用输出参数

    a = np.array([2,4,5,6])
    b = np.array([2,2,3,3])
    c = np.zeros((4,))
    np.add(  a,b,c )
    print( c )

    5.2 行数组和列数组 

    a = np.arange(3)
    b = np.arange(3)[:, np.newaxis]
     
    print(a)
    print(b)

    输出: 

    [0 1 2]
    [[0]
     [1]
     [2]] 

    5.3 广播规则示例

    a = np.arange(3)
    b = np.arange(3)[:, np.newaxis]
     
    print(a)
    print(b)
     
    s = a + b
    print(s)

    六、ufunc后的数列运算

    6.1 数列运算

    在执行ufunc运算后,常常伴随数列运算,它们如下

    __call__(*args, **kwargs)

    Call self as a function.

    accumulate(array[, axis, dtype, out])

    Accumulate the result of applying the operator to all elements.

    at(a, indices[, b])

    Performs unbuffered in place operation on operand 'a' for elements specified by 'indices'.

    outer(A, B, /, **kwargs)

    Apply the ufunc op to all pairs (a, b) with a in A and b in B.

    reduce(array[, axis, dtype, out, keepdims, ...])

    Reduces array's dimension by one, by applying ufunc along one axis.

    reduceat(array, indices[, axis, dtype, out])

    Performs a (local) reduce with specified slices over a single axis.

    resolve_dtypes(dtypes, *[, signature, ...])

    Find the dtypes NumPy will use for the operation.

    6.2 累计模式

    累计模式不可以单独使用,而是与add以及multiply搭配使用:

    np.add.accumulate([2, 3, 5])
    array([ 2,  5, 10])
    np.multiply.accumulate([2, 3, 5])
    array([ 2,  6, 30])
    np.add.accumulate(I, 0)
    array([[1.,  0.],
           [1.,  1.]])
    np.add.accumulate(I) # no axis specified = axis zero
    array([[1.,  0.],
           [1.,  1.]])

    6.3 对数组中某个index的元素进行局部处理 

             1)   将项目 0 和 1 设置为负值:

    a = np.array([1, 2, 3, 4])
    np.negative.at(a, [0, 1])
    print( a )
    array([-1, -2,  3,  4])

             2)  递增项目 0 和 1,递增项目 2 两次:

    a = np.array([1, 2, 3, 4])
    np.add.at(a, [0, 1, 2, 2], 1)
    print( a )
    array([2, 3, 5, 4])

             3) 将第一个数组中的项 0 和 1 添加到第二个数组,并将结果存储在第一个数组中:

    a = np.array([1, 2, 3, 4])
    b = np.array([1, 2])
    np.add.at(a, [0, 1], b)
    print(a)
    array([2, 4, 3, 4])

     6.4 outer外积

    简单数组外积

    np.multiply.outer([1, 2, 3], [4, 5, 6])
    array([[ 4,  5,  6],
           [ 8, 10, 12],
           [12, 15, 18]])

    张量的外积 

    A = np.array([[1, 2, 3], [4, 5, 6]])
    A.shape
    (2, 3)
    B = np.array([[1, 2, 3, 4]])
    B.shape
    (1, 4)
    C = np.multiply.outer(A, B)
    C.shape; C
    (2, 3, 1, 4)
    array([[[[ 1,  2,  3,  4]],
            [[ 2,  4,  6,  8]],
            [[ 3,  6,  9, 12]]],
           [[[ 4,  8, 12, 16]],
            [[ 5, 10, 15, 20]],
            [[ 6, 12, 18, 24]]]])

     6.5 reduce方法

    a = np.multiply.reduce([2,3,5])
    print( a)
    30
    X = np.arange(8).reshape((2,2,2))
    X
    array([[[0, 1],
            [2, 3]],
           [[4, 5],
            [6, 7]]])
    np.add.reduce(X, 0)
    array([[ 4,  6],
           [ 8, 10]])
    np.add.reduce(X) # confirm: default axis value is 0
    array([[ 4,  6],
           [ 8, 10]])
    np.add.reduce(X, 1)
    array([[ 2,  4],
           [10, 12]])
    np.add.reduce(X, 2)
    array([[ 1,  5],
           [ 9, 13]])

    您可以使用 initial 关键字参数以不同的值初始化缩减,以及在何处选择要包含的特定元素:

    np.add.reduce([10], initial=5)
    15
    np.add.reduce(np.ones((2, 2, 2)), axis=(0, 2), initial=10)
    array([14., 14.])
    a = np.array([10., np.nan, 10])
    np.add.reduce(a, where=~np.isnan(a))
    20.0
    np.minimum.reduce([], initial=np.inf)
    inf
    np.minimum.reduce([[1., 2.], [3., 4.]], initial=10., where=[True, False])
    array([ 1., 10.])
    np.minimum.reduce([])
    Traceback (most recent call last):
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。