二、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])
对于数组x
,numpy
定义了下面的操作:
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]
-
有几点注意:
- 位运算符的优先级要比比较运算符高
- 整数数组的位运算和
C
语言的位运算符相同,注意正负号
6、自定义ufunc函数
可以通过frompyfunc()
将计算单个元素的函数转换成ufunc
函数。调用格式为:my_ufunc=frompyfunc(func,nin,nout)
。其中:
func
:计算单个元素的函数nin
:func
的输入参数的个数nout
:func
返回值的个数
调用时,使用my_ufunc(...)
即可。
也可以通过vectorize()
函数来实现frompyfunc()
的功能。其原型为: np.vectorize(func, otypes='', doc=None, excluded=None)
。其中:
func
:计算单个元素的函数otypes
:可以是一个表示结果数组元素类型的字符串,也可以是一个类型列表。如果使用类型列表,可以描述多个返回数组的元素类型doc
:函数的描述字符串。若未给定,则使用func.__doc__
excluded
:指定func
中哪些参数未被向量化。你可以指定一个字符串和整数的集合,其中字符串代表关键字参数,整数代表位置参数。
7.ufunc 对象的方法
-
ufunc
函数对象本身还有一些方法。- 这些方法只对于两个输入、一个输出的
ufunc
函数函数有效。对于其他的ufunc
函数对象调用这些方法时,会抛出ValueError
异常。
- 这些方法只对于两个输入、一个输出的
-
ufunc.reduce
方法:类似于Python
的reduce
函数,它沿着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
。设A
的shape=(4,5)
,B
的shape
为(4,)
,则结果数组的shape=(4,5,4)。
- 一维数组和一维数组的
outer
操作为二维数组 - 多维数组的
outer
拆分成各自的一维操作 - 相当于把数组1 广播为(4,5,4),数组二广播为(4,5,4)然后再进行广播后的运算。
8. 数学函数
-
下面是一元的数学函数:
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、总结
内容来自网络,侵删。