前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门 3-8 Numpy 中的聚合运算

机器学习入门 3-8 Numpy 中的聚合运算

作者头像
触摸壹缕阳光
发布2022-05-25 14:03:39
4080
发布2022-05-25 14:03:39
举报

一维数组的聚合操作

聚合操作简单来说就是把一组值变成一个值。首先创建一个一维数组:

代码语言: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 参数。

代码语言:javascript
复制
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:

  1. Python3入门机器学习 经典算法与应用: https://coding.imooc.com/class/chapter/169.html#Anchor
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一维数组的聚合操作
  • 二维数组的聚合操作
  • 其它聚合操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档