ufunc是universal function的缩写,它是一种能对数组的每个元素进行操作的函数。本节主要介绍算术运算、比较运算和统计运算等函数。
3.5.1 算术运算
add()函数,即加法运算,是最常用的算术运算函数。示例代码:
>>>a = np.arange(0, 4)
>>>a
array( [0, 1, 2, 3] )
>>>b = np.arange(1, 5)
>>>b
array( [1, 2, 3, 4] )
>>>np.add(a, b)
array( [1, 3, 5, 7] )
>>>np.add(a, b, a)
array( [1, 3, 5, 7] )
>>>a
array( [1, 3, 5, 7] )
add()函数返回一个新的数组,此数组的每个元素都为两个参数数组的对应元素之和。它接受的第3个参数指定计算结果所要写入的数组,如果指定的话,add()函数就不再产生新的数组。由于Python的操作符重载功能,计算两个数组相加可以简单地写为a + b,add(a, b, a)即表示为a+=b。
与加法类似,每一个算术运算符与一个ufunc函数对应,如下表所示:
表达式 | 对应的ufunc函数 |
---|---|
y = x1 + x2 | add(x1, x2 [, y]) |
y = x1 - x2 | subtract(x1, x2 [, y]) |
y = x1 * x2 | multiply(x1, x2 [, y]) |
y = x1/x2 | divide(x1, x2 [, y]),如果两个数组的元素为整数,那么用整数除法 |
y = x1/x2 | true_divide(x1, x2 [, y]),总是返回精确的商 |
y = x1//x2 | floor_divide(x1, x2 [, y]),总是对返回的值取整 |
y = -x | negative(x [, y]),取反 |
y = x1 ** x2 | power(x1, x2 [, y]) |
y = x1 % x2 | remainder(x1, x2 [, y]),mod(x1, x2 [, y]) |
数组对象支持算术运算操作符,极大地简化了算式的编写。除了基本的算术运算操作,ufunc也提供其他数学函数,如下表所示:
函数名 | 功能说明 |
---|---|
abs() | 绝对值 |
floor() | 向下取整 |
exp() | 指数函数 |
log() | 对数函数 |
sqrt() | 平方根函数 |
sin() | 正弦函数 |
cos() | 余弦函数 |
示例代码:
>>>a = np.array([1, 2, 3, 4])
>>>exp(a)
array([ 2.71828183, 7.3890561 , 20.08553692, 54.59815003])
>>>log(a)
array([ 0. , 0.69314718, 1.09861229, 1.38629436])
>>>sqrt(a)
array([ 1. , 1.41421356, 1.73205081, 2. ])
3.5.2 比较运算
使用==、>等比较运算符对两个数组进行比较,将返回一个布尔数组,它的每个元素值都是两个数组对应元素的比较结果。示例代码:
>>>np.array([1, 2, 3]) < np.array([3, 2, 1])
array( [True, False, False]), dtype = bool )
每一个比较运算符与一个ufunc函数对应,如下表所示:
表达式 | 对应的ufunc函数 |
---|---|
y = x1 == x2 | equal(x1, x2 [, y]) |
y = x1 != x2 | not_equal(x1, x2 [, y]) |
y = x1 < x2 | less(x1, x2 [, y]) |
y = x1 <= x2 | less_equal(x1, x2 [, y]) |
y = x1 > x2 | greater(x1, x2 [, y]) |
y = x1 >= x2 | greater_equal(x1, x2 [, y]) |
此外,一个数组也可以跟指定值进行比较,其规则等价于数组中的每个元素与指定值进行对比,结果为真返回True,为假返回False,示例代码:
>>>arr = np.random.randint(0,10,size=(4, 4))
>>>arr
array([[6, 2, 5, 6],
[3, 5, 1, 3],
[0, 9, 0, 7],
[2, 1, 7, 0]])
>>>arr == 1
array([[False, False, False, False],
[False, False, True, False],
[False, False, False, False],
[False, True, False, False]], dtype=bool)
>>>arr > 3
array([[ True, False, True, True],
[False, True, False, False],
[False, True, False, True],
[False, False, True, False]], dtype=bool)
>>>arr[:, 1] == 5 #指定第2列所有值是否等于5
array([False, True, False, False], dtype=bool)
3.5.3 统计运算
使用统计函数可以描述数组元素的各种统计指标,以sum()函数为例,sum()计算数组元素之和,当数组是多维时,它计算数组中所有元素之和。示例代码:
>>>a = np.random.randint(0, 10, size=(4, 5))
>>>a
>>>np.sum(a)
如果指定axis参数,则求和运算沿着指定的轴进行。在上面的例子中,数组a的第0轴的长度是4,第1轴的长度是5。如果axis参数为1,则对每行上的5个数求和,所得的结果是长度为4的一维数组。如果参数axis为0,则对每列上的4个数求和,结果是长度为5的一维数组。示例代码:
>>>np.sum(a, axis = 1)
>>>np.sum(a, axis = 0)
主要使用的统计函数及功能如下表所示:
函数名 | 功能 |
---|---|
sum | 求和 |
mean | 求期望 |
median | 求中位数 |
std | 求标准差 |
var | 求方差 |
cumsum | 求累加和 |
min | 求最小值 |
max | 求最大值 |
以上函数的参数与sum()相同,且注意axis参数参与运算的轴的对应位置。
3.5.5 数组排序
ufunc函数除了参与对数组的各种运算,也提供对数组元素排序的方法和函数。注意,数组的sort()方法对数组进行排序,它会改变数组的内容;sort()函数返回一个新数组。它们的axis默认值都为-1,即沿着数组的最终轴进行排序。sort()函数的axis参数可以设置为None,此时它将得到平坦化之后进行排序的新数组。示例代码:
>>>a = np.random.randint(0, 10, size=(4, 5))
>>>a
>>>b = np.sort(a)
>>>c = np.sort(a, axis = 0)
>>>d = np.sort(a, axis = None)
>>>a
>>>b
>>>c
>>>d
>>>a.sort()
>>>a
在上面的例子中,np.sort(a)对a中每行的数组进行排序,np.sort(a, axis=0)对数组a每列上的数值进行排序,np.sort(a, axis = None)得到排序后的一维数组,以上三个函数没有改变数组a的内容;而a.sort()的方法则改变了数组a的内容,且以行进行排序。
网友评论