首页 > NumPy 阅读数:35

NumPy ufunc通用函数

NumPy 中的 ufunc 对象也称为 ufunc 函数,它包含了对数组进行处理的通用函数。通用函数(ufunc)是针对 ndarray 数组对象执行元素级运算的函数,即通用函数会对数组中的每一个元素值作用后产生新的元素值,并返回新的元素值组成的数组,因此,通用函数(ufunc)都是以 NumPy 数组作为输出的。

通用函数(ufunc)的分类:
  • 按照通用函数(ufunc)所接收的数组参数个数来划分,接收一个数组参数的称为一元通用函数,而接收两个数组参数的称为二元通用函数;
  • 按照通用函数(ufunc)的运算功能划分,常用的通用函数(ufunc)运算有四则运算、比较运算和逻辑运算等。通用函数(ufunc)支持全部的四则运算,并且保留习惯的运算符,与数值运算使用方法相同,但要注意操作的对象是数组。

常用的一元通用函数说明如表 1 所示,常用的二元通用函数说明如表 2 所示。

表 1:常用的一元通用函数
函数 说明
ceil() 计算各元素的 ceiling 值,即大于等于该值的最小整数
floor 计算各元素的 floor 值,即小于等于该值的最大整数
rint() 将各元素的值四舍五入到最接近的整数,保留 dtype
modf() 将数组的小数和整数部分以两个独立数组的形式返回
isnan() 返回一个"哪些值是 NaN (Not a Numbed)"的布尔型数组
isfinite、isinf() 分别返回一个表不"哪些元素是有穷的(非inf,非NaN )”或“哪些元素是无穷” 的布尔型数组
abs()、fabs() 计算整数、浮点数或复数的绝对值,对于非复数值可以使用更快的 fabs
sqrt() 计算各元素的平方根,相当于 arr**0.5
square() 计算各元素的平方,相当于 arr**2
exp() 计算各元素的指数 ex
log()、Ioh10()、Icg2()、 log1p() 分别为自然对数(底数为 e ),底数为 10,底数为2, log(1+x)
sing() 计算各元素的正负号,1 (正数),0 (零),-1 (负数)
arccos()、arccosh()、arcsin()、 arcsinh()、arctan()、arctanh() 反三角函数
logical_not() 计算各元素取反,相当于 -arr

表 2:常用的二元通用函数
函数 等价运算符 说明
add() + 将数组中对应元素相加
subtract() - 从第一数组中减去第二数组中的元素
multipIy() * 将数组中对应元素相乘(数量积)
dot()   数组中对应元素相乘的累加和(矢量积)
divide()、floor_divide() /、// 将数组中对应元素相除或向下整除
mod()、 remainder()、fmod()
%
元素级的求模计算(除法的余数);
mod与remainder的功能完全一致;
fmod处理负数的方式与remainder、mod和%不同, 所得余数的正负由被除数决走,与除数的正负无关
maximum()、fmax()   元素级的最大值计算,fmax 将忽略 NaN
minimum()、fmin()   元素级的最小值计算,fmin 将忽略 NaN
power() ** 对第一个数组中的元素 A,根据第二个数组中的相应元素 B,计算AB
copysing()   将第二个数组中的值的符号复制给第一个数组中的值
equal()、not_equal()、 greater()、greater_equal()、less()、less_equal()
==、!=、> 、>=、<、<=
执行元素级的比较运算,最终产生布尔型数组
logical_and()、logical_or()、logical xor() &、|、^ 执行元素级的真值逻辑运算,返回布尔型值

注意:在二元通用函数中,当第二个参数为标量时,将进行广播(Broadcast)运算。

【例 1】定义 arr 为 0~9 的一维数组,运用通用函数完成下列计算。
1) 对 arr 数组求平方根和将 arr 数组与2相加。
2) 将 arr 数组的平方根乘 3 的 arr_f 数组的浮点数分解成整数和小数部分。
3) 求 arr_f 与 arr 的最大值。
4) 定义一个 0~6 的 2 行 3 列数组和 0~3 的一维数组,计算这两个数组的矢量积和数量积。

示例代码 test1 如下。
# -*- coding: utf-8 -*-
import numpy as np
arr = np.arange(10)
arr_a = np.sqrt(arr)
print ('求平方根',arr_a)
print('数组与标量相加')
print(np.add(arr,2))
print ('使用modf函数把浮点数分解成整数和小数部分')
arr_f = arr_a * 3  # 统一乘3
print (np.modf(arr_f))
print ('数组比较')
print(arr_f,arr)
print(np.maximum(arr_f,arr))
#计算数组矢量积和数量积
arr_a = np.arange(6).reshape(2,3)
arr_b = np.arange(3)
print('计算数组矢量积',np.dot(arr_a,arr_b))
print('计算数组数量积',arr_a*arr_b)