一维数组的聚合操作
聚合操作简单来说就是把一组值变成一个值。首先创建一个一维数组:
代码语言:javascript复制import numpy as np
L = np.random.random(100)
在原生 Python 中,如果我们想计算一个元素为数值型的可迭代对象中所有元素的和,可以使用 Python 内置的 sum 函数。在 NumPy 中不仅支持 Python 内置的 sum 函数,而且还提供了优化后的 numpy.sum。
两个能够实现相同操作的函数主要是效率上的差别:
代码语言:javascript复制big_array = np.random.rand(1000000)
%timeit sum(big_array)
%timeit np.sum(big_array)
'''
86.6 ms ± 12.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
1.24 ms ± 87.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
'''
针对一维数组,Python 内置的 sum 函数用了 86.6 ms,而使用 NumPy 提供的优化的 sum 函数,只用了 1.24 ms。
二维数组的聚合操作
上面都是对一维数组进行的聚合运算,接下来看看对二维数组的聚合运算。
代码语言:javascript复制X = np.arange(16).reshape(4, -1)
print(X)
'''
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
'''
如果直接使用 sum 函数。
代码语言:javascript复制print(np.sum(X)) # 120
通过结果可以看出聚合函数默认是数组中的所有元素进行聚合运算。但是,有时我们需要求出每一行或者每一列的和,此时我们可以为聚合函数指定 axis
参数。
print(np.sum(X, axis = 0))
'''
array([24, 28, 32, 36])
'''
print(np.sum(X, axis = 1))
'''
array([ 6, 22, 38, 54])
'''
还有一个记忆的小技巧,axis 指定那个轴,就可以理解为将这个轴压缩掉。比如,对于形状为 (2, 3, 4) 的三维数组,如果指定:
- axis = 0,则聚合后的数组形状为 (3, 4)
- axis = 1,则聚合后的数组形状为 (2, 4)
- axis = 2,则聚合后的数组形状为 (2, 3)
其它聚合操作
NumPy 还提供了哪些聚合操作呢?
代码语言:javascript复制np.min(big_array) # 求数组中所有元素的最小值
np.max(big_array) # 求数组中所有元素的最大值
np.prod(big_array) # 求数组中所有元素的乘积
np.mean(big_array) # 求数组中所有元素的平均值
np.median(big_array) # 求数组中所有元素的中位数
np.var(big_array) # 求数组中所有元素的方差
np.std(big_array) # 求数组中所有元素的标准差
代码语言:javascript复制# 计算数组的分位数
print(np.percentile(big_array, q = 50)) # 0.4999277982627047
print(np.median(big_array)) # 0.499927798262704
50 % 的分位数为 0.499,表示数组中有 50% 的元素都是小于等于 0.499 的,和数组的中位数是一个值。
代码语言:javascript复制print(np.percentile(big_array, q = 100)) # 0.9999995837112496
print(np.max(big_array)) # 0.9999995837112496
数组中有 100% 所有元素都小于等于 0.99,换句话说,就是数组中的最大值。
通常我们会对 0, 25, 50, 75, 100 这几个分位点感兴趣:
代码语言:javascript复制# 0分位点 - 最小值
# 50分位点 - 中位数
# 100分位点 - 最大值
for percent in [0, 25, 50, 75, 100]:
print(np.percentile(big_array, q = percent))
'''
1.1523933538537534e-06
0.24955193876285395
0.4999277982627047
0.7504715081185795
0.9999995837112496
'''
除了使用上面函数的调用方式,我们还可以使用面向对象的调用方式。
代码语言:javascript复制big_array.min()
big_array.max()
big_array.sum()
使用哪种方式实现聚合操作,其实没有特别的说明。不过推荐使用 np.函数()
的方式,因为有些运算没有实现面向对象的调用方式,并且使用 np.函数()
的方式能够提醒我们这里是在调用 NumPy 库中的方法。
References:
- Python3入门机器学习 经典算法与应用: https://coding.imooc.com/class/chapter/169.html#Anchor