返回介绍

数学基础

统计学习

深度学习

工具

Scala

二、 ufunc 函数

发布于 2023-07-17 23:38:23 字数 12354 浏览 0 评论 0 收藏 0

  1. ufunc 函数是对数组的每个元素进行运算的函数。numpy很多内置的ufunc函数使用C语言实现的,计算速度非常快。

  2. 基本上所有的ufunc函数可以指定一个out参数来保存计算结果数组,并返回out数组。同时如果未指定out参数,则创建新的数组来保存计算结果。

    • 如果你指定了out参数,则要求out数组与计算结果兼容。即:数组的尺寸要严格匹配,并且数组的dtype要匹配。 ufunc_out
  3. numpy的某些ufunc函数,如numpy.sin(),支持计算单个数值。但是在单个数值的计算速度上,pythonmath.sin()要快得多。两个原因:

    • numpy.sin()为了同时支持数组和单个数值运算,其C语言的内部实现要比math.sin()复杂
    • 单个数值的计算上:numpy.sin()返回的是numpy.float64类型,而math.sin()返回的是python的标准float类型

1. 广播

  1. 当使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算。这就要求这两个数组的形状相同。如果这两个数组的形状不同,就通过广播broadcasting进行处理:

    • 首先让所有输入数组都向其中维度最高的数组看齐。看齐方式为:在shape属性的左侧插入数字1
    • 然后输出数组的shape属性是输入数组的shape属性的各轴上的最大值
    • 如果输入数组的某个轴的长度为 1,或者与输出数组的各对应轴的长度相同,该数组能正确广播。否则计算出错
    • 当输入数组的某个轴的长度为 1时,沿着此轴运算时都用此轴上的第一组值。

    broadcast

  2. 可以通过numpy.broadcast_arrays() 查看广播之后的数组 broadcast_arrays

  3. 你可以通过ndarray.repeat()方法来手动重复某个轴上的值.其用法为ndarray.repeat(repeats, axis=None),其中:

    • repeats为重复次数
    • axis指定被重复的轴,即沿着哪一轴重复。如果未指定,则将数组展平然后重复。返回的也是一个展平的数组

    被重复的是该轴的每一组值。

    repeat

  4. numpy提供了ogrid对象,用于创建广播运算用的数组。ogrid对象像多维数组一样,使用切片元组作为下标,返回的是一组可以用于广播计算的数组。其切片有两种形式:

    • 开始值:结束值:步长。它指定返回数组的开始值和结束值(不包括)。默认的开始值为 0;默认的步长为 1。与np.arange类似
    • 开始值:结束值:长度 j。当第三个参数为虚数时,表示返回的数组的长度。与np.linspace类似。
    • 有多少个下标,则结果就是多少维的,同时也返回相应数量的数组。每个返回的数组只有某一维度长度大于1,其他维度的长度全部为 1。假设下标元组长度为3,则结果元组中:第一个数组的shape=(3,1,1),第二个数组的shape=(1,3,1),第三个数组的shape=(1,1,3)ogrid
  5. numpy还提供了mgrid对象,它类似于ogrid对象。但是它返回的是广播之后的数组,而不是广播之前的数组:

    ​ !mgrid

  6. numpy提供了meshgrid()函数,其用法为:numpy.meshgrid(x1,x2,...xn)。其中xi是都是一维数组。返回一个元组 (X1,X2,...Xn),是广播之后的数组。假设xi的长度为 li,则返回元组的每个数组的形状都是 (l1,l2,...ln)

    meshgrid

  7. numpy.ix_()函数可以将N个一维数组转换成可广播的N维数组。其用法为numpy.ix_(x1,x2,x3),返回一个元组。元组元素分别为对应的可广播的N维数组。

    • 返回的是广播前的数组,而不是广播后的数组

    • 每个转换前的一维数组,对应了一个转换后的 N 维数组

      ix_

2. 四则运算

  1. numpy提供的四则运算如下,这些四则运算同时提供了函数形式以及表达式形式:

    • 加法:表达式形式y=x1+x2,使用ufunc函数的形式:numpy.add(x1,x2[,out=y])

    • 减法:表达式形式y=x1-x2,使用ufunc函数的形式:numpy.subtract(x1,x2[,out=y])

    • 乘法:表达式形式y=x1*x2,使用ufunc函数的形式:numpy.multiply(x1,x2[,out=y])

    • 真除法:表达式形式y=x1/x2,使用ufunc函数的形式:numpy.true_divide(x1,x2[,out=y])

      • python3 中,numpy.divide(x1,x2[,out=y])也是真除法
    • 取整除法:表达式形式y=x1//x2,使用ufunc函数的形式:numpy.floor_divide(x1,x2[,out=y])

    • 取反:表达式形式y=-x,使用ufunc函数的形式:numpy.negative(x[,out=y])

    • 乘方:表达式形式y=x1**x2,使用ufunc函数的形式:numpy.power(x1,x2[,out=y])

    • 取余数:表达式形式y=x1%x2,使用ufunc函数的形式:numpy.remainder(x1,x2[,out=y])

    arithmetic

  2. 对于 np.add(a,b,a) 这种可以使用a+=b来表示。这些四则运算都可以采用这种方式。

  3. 当表达式很复杂时,如果同时数组很大,则会因为产生大量的中间结果而降低程序的运算速度。如: x=a*b+c等价于:

    
    
    xxxxxxxxxx
    t=a*b x=t+c del t

    我们可以使用:

    
    
    xxxxxxxxxx
    x=a*b x+=c

    从而减少了一次内存分配。

3. 比较运算

  1. numpy提供的比较运算如下,这些比较运算同时提供了函数形式以及表达式形式,并且产生的结果是布尔类型的数组:

    • 等于: 表达式形式y=x1==x2,使用ufunc函数的形式:numpy.equal(x1,x2[,out=y])
    • 不等于: 表达式形式y=x1!=x2,使用ufunc函数的形式:numpy.not_equal(x1,x2[,out=y])
    • 小于: 表达式形式y=x1<x2,使用ufunc函数的形式:numpy.less(x1,x2[,out=y])
    • 小于等于: 表达式形式y=x1<=x2,使用ufunc函数的形式:numpy.less_equal(x1,x2[,out=y])
    • 大于: 表达式形式y=x1>x2,使用ufunc函数的形式:numpy.greater(x1,x2[,out=y])
    • 大于等于: 表达式形式y=x1>=x2,使用ufunc函数的形式:numpy.greater_equal(x1,x2[,out=y])

    compare

4. 逻辑运算

  1. 由于python中的布尔运算使用and/or/not关键字,因此它们无法被重载。numpy提供的数组布尔运算只能通过ufunc函数进行,这些函数以logical_开头。进行逻辑运算时,对于数值零视作False;对数值非零视作True。运算结果也是一个布尔类型的数组:

    • 与:ufunc函数的形式:numpy.logical_and(x1,x2[,out=y])
    • 或:ufunc函数的形式:numpy.logical_or(x1,x2[,out=y])
    • 否定:ufunc函数的形式:numpy.logical_not(x[,out=y])
    • 异或:ufunc函数的形式:numpy.logical_xor(x1,x2[,out=y])

    logical

  2. 对于数组xnumpy定义了下面的操作:

    • numpy.any(x):只要数组中有一个元素值为True(如果数值类型,则为非零),则结果就返回True;否则返回False
    • numpy.all(x):只有数组中所有元素都为True(如果数值类型,则为非零),则结果才返回True;否则返回False any_all

5. 位运算

  1. numpy提供的位运算如下,这些位运算同时提供了函数形式(这些函数以bitwise_开头)以及表达式形式。其中输入数组必须是整数或者布尔类型(如果是浮点数则报错):

    • 按位与:表达式形式y=x1&x2,使用ufunc函数的形式:numpy.bitwise_and(x1,x2[,out=y])
    • 按位或:表达式形式y=x1|x2,使用ufunc函数的形式:numpy.bitwise_or(x1,x2[,out=y])
    • 按位取反:表达式形式y=~x,使用ufunc函数的形式:numpy.bitwise_not(x[,out=y])
    • 按位异或:表达式形式y=x1^x2,使用ufunc函数的形式:numpy.bitwise_xor(x1,x2[,out=y])

    bitwise

  2. 有几点注意:

    • 位运算符的优先级要比比较运算符高
    • 整数数组的位运算和C语言的位运算符相同,注意正负号

6. 自定义 ufunc 函数

  1. 可以通过frompyfunc()将计算单个元素的函数转换成ufunc函数。调用格式为:my_ufunc=frompyfunc(func,nin,nout)。其中:

    • func:计算单个元素的函数
    • ninfunc的输入参数的个数
    • noutfunc返回值的个数

    调用时,使用my_ufunc(...)即可。 frompyfunc

  2. 也可以通过vectorize()函数来实现frompyfunc()的功能。其原型为: np.vectorize(func, otypes='', doc=None, excluded=None)。其中:

    • func:计算单个元素的函数
    • otypes:可以是一个表示结果数组元素类型的字符串,也可以是一个类型列表。如果使用类型列表,可以描述多个返回数组的元素类型
    • doc:函数的描述字符串。若未给定,则使用func.__doc__
    • excluded:指定func中哪些参数未被向量化。你可以指定一个字符串和整数的集合,其中字符串代表关键字参数,整数代表位置参数。

    vectorize

7. ufunc 对象的方法

  1. ufunc函数对象本身还有一些方法。

    • 这些方法只对于两个输入、一个输出的ufunc函数函数有效。对于其他的ufunc函数对象调用这些方法时,会抛出ValueError异常。
  2. ufunc.reduce方法:类似于Pythonreduce函数,它沿着axis参数指定的轴,对数组进行操作。

    • 相当于将<op>运算符插入到沿着axis轴的所有元素之间:<op>.reduce(array,axis=0,dtype=None)
    • 经过一次reduce,结果数组的维度降低一维

    reduce

  3. ufunc.accumulate方法:它类似于reduce()的计算过程,但是它会保存所有的中间计算结果,从而使得返回数组的形状和输入数组的形状相同: accumulate

  4. ufunc.outer方法:相当于将<op>运算符对输入数组A和输入数组B的每一对元素对(a,b)起作用:<op>.reduce(A,B)。结果数组维度为A.dim+B.dim。设Ashape=(4,5)Bshape(4,),则结果数组的shape=(4,5,4)

    • 一维数组和一维数组的outer操作为二维数组
    • 多维数组的outer拆分成各自的一维操作 outer

8. 数学函数

  1. 下面是一元的数学函数:

    • abs/fabs:计算整数、浮点数或者复数的绝对值。对于非复数值,可以使用更快的fabs
    • sqrt :计算平方根,相当于a**0.5
    • square:计算平方,相当于a**2
    • exp:计算指数 $ MathJax-Element-50 $
    • log/log10/log2/log1p:分别为 $ MathJax-Element-51 $
    • sign:计算 $ MathJax-Element-52 $
    • ceil:计算各元素的ceiling值:大于等于该值的最小整数
    • floor:计算个元素的floor值:小于等于该值的最大整数
    • rint:将各元素四舍五入到最接近的整数,保留dtype
    • modf:将数组的小数和整数部分以两个独立数组的形式返回
    • isnan:返回一个布尔数组,该数组指示那些是NaN
    • isfinite/isinf:返回一个布尔数组,该数组指示哪些是有限的/无限数
    • cos/cosh/sin/sinh/tan/tanh:普通和双曲型三角函数
    • arccos/arcsosh/arcsin/arcsinh/arctan/arctanh:反三角函数

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文