Numpy----------(六)

本文详细介绍了numpy库中的ufunc函数,包括四则运算、比较运算、逻辑运算、位运算以及如何自定义ufunc函数。此外,还概述了ufunc对象的方法,如reduce、accumulate和outer,以及一元数学函数的使用。
摘要由CSDN通过智能技术生成

二、ufunc函数

     2.四则运算

    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])

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

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

  •  t=a*b
      x=t+c
      del t
  • 可以使用
  •   x=a*b
      x+=c
  • 从而减少了一次内存分配。

3. 比较运算    

    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])

    

4.逻辑运算

    由于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])

    

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

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

5. 位运算

     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]

    

  1. 有几点注意:

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

    6、自定义ufunc函数

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

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

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

       

        

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

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

   

  7.ufunc 对象的方法

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

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

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

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

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拆分成各自的一维操作
  • 相当于把数组1 广播为(4,5,4),数组二广播为(4,5,4)然后再进行广播后的运算。

8. 数学函数

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

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

9、总结

    内容来自网络,侵删。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值