numpy用于操作数组,数组中的元素最常见的就是字符串和数值两种类型,本文针对数值型的数组,总结归纳了常用的数学运算和统计的函数。
在numpy中,有一个通函数-ufunc的概念,通函数是一类对数组中的元素逐个操作的函数,支持数组广播,类型转换以及一些其他的标准功能。numpy中定义了许多的通函数,用来对数组进行处理,比如最基本的数组加法运算
>>> import numpy as np
>>> a = np.arange(4)
>>> a
array([0, 1, 2, 3])
>>> b = np.arange(1,5)
>>> b
array([1, 2, 3, 4])
>>> a + b
array([1, 3, 5, 7])
上述代码在内部是通过调用通函数add来实现的,我们也可以单独调用通函数,用法如下
>>> np.add(a, b)
array([1, 3, 5, 7])
针对数值型数组,常用的数学运算的通函数有以下几种
1. 两个数组间的算术运算
两个数组间的加减乘除等算术运算,用法如下
>>> a
array([0, 1, 2, 3])
>>> b
array([1, 2, 3, 4])
# 加法
>>> np.add(a,b)
array([1, 3, 5, 7])
# 减法
>>> np.subtract(a,b)
array([-1, -1, -1, -1])
# 乘法
>>> np.multiply(a,b)
array([ 0, 2, 6, 12])
# 除法
>>> np.divide(a,b)
array([0. , 0.5 , 0.66666667, 0.75 ])
# 乘方
>>> np.power(a,b)
array([ 0, 1, 8, 81], dtype=int32)
# 取余数
>>> np.remainder(a,b)
array([0, 1, 2, 3], dtype=int32)
# 取余数
>>> np.mod(a,b)
array([0, 1, 2, 3], dtype=int32)
# 取余数
>>> np.fmod(a,b)
array([0, 1, 2, 3], dtype=int32)
# 同时取商和余数
>>> np.divmod(a,b)
(array([0, 0, 0, 0], dtype=int32), array([0, 1, 2, 3], dtype=int32))
2. 单个数组的数学运算
包括绝对值,四舍五入以及指数和对数运算,用法如下
# 绝对值
>>> np.absolute(a)
array([0, 1, 2, 3])
# 绝对值
>>> np.fabs(a)
array([0., 1., 2., 3.])
>>> a = np.array([0.4, 1.2, 2.6, 3.5])
# 四舍五入为最近的整数
>>> np.rint(a)
array([0., 1., 3., 4.])
>>> np.around(a)
array([0., 1., 3., 4.])
>>> np.round(a)
array([0., 1., 3., 4.])
# 只保留整数位
>>> np.fix(a)
array([0., 1., 2., 3.])
# 向下取整
>>> np.floor(a)
array([0., 1., 2., 3.])
# 向上取整
>>> np.ceil(a)
array([1., 2., 3., 4.])
# 只保留整数位
>>> np.trunc(a)
array([0., 1., 2., 3.])
# 自然对数的指数
>>> np.exp(a)
array([ 1. , 2.71828183, 7.3890561 , 20.08553692])
# 2的指数
>>> np.exp2(a)
array([1., 2., 4., 8.])
# 自然对数为底的对数
>>> np.log(b)
array([ -inf, 0. , 0.69314718, 1.09861229])
# 以2为底的对数
>>> np.log2(b)
array([ -inf, 0. , 1. , 1.5849625])
# 以10为底的对数
>>> np.log10(b)
array([ -inf, 0. , 0.30103 , 0.47712125])
# 平方根
>>> np.sqrt(a)
array([0. , 1. , 1.41421356, 1.73205081])
# 平方
>>> np.square(a)
array([0, 1, 4, 9], dtype=int32)
对于数值型数组,经常需要统计极值,均值,方差,中位数等统计指标,常用的统计函数用法如下
>>> a = np.arange(100)
# 最小值
>>> np.amin(a)
0
# 最大值
>>> np.amax(a)
99
# 最小值,忽略NaN
>>> np.nanmin(a)
0
# 最大值,忽略NaN
>>> np.nanmax(a)
99
# 求和
>>> np.sum(a)
4950
# 求和,忽略NaN
>>> np.nansum(a)
4950
# 极差,最大值 - 最小值
>>> np.ptp(a)
99
# 百分位数
>>> np.percentile(a, q = [25, 50, 75])
array([24.75, 49.5 , 74.25])
# 百分位数,忽略NaN
>>> np.nanpercentile(a, q = [25, 50, 75])
array([24.75, 49.5 , 74.25])
# 百分位数
>>> np.quantile(a, q = [0.25, 0.5, 0.75])
array([24.75, 49.5 , 74.25])
# 百分位数,忽略NaN
>>> np.nanquantile(a, q = [0.25, 0.5, 0.75])
array([24.75, 49.5 , 74.25])
# 均值
>>> np.mean(a)
49.5
# 均值
>>> np.average(a)
49.5
# 均值, 忽略NaN
>>> np.nanmean(a)
49.5
# 中位数
>>> np.median(a)
49.5
# 中位数,忽略NaN
>>> np.nanmedian(a)
49.5
# 标准差
>>> np.std(a)
28.86607004772212
# 标准差,忽略NaN
>>> np.nanstd(a)
28.86607004772212
# 方差
>>> np.var(a)
833.25
# 方差,忽略NaN
>>> np.var(a)
833.25
# 计算每个区间的频数,区间为左闭右开
>>> np.histogram(a, bins = [0, 20, 40, 60, 80, 100])
(array([20, 20, 20, 20, 20], dtype=int32), array([ 0, 20, 40, 60, 80, 100]))
numpy内置的函数非常丰富,基本满足了日常开发的需求,熟练使用每个函数,可以提高我们的编码效率。