【问题标题】:How do you get the average of each tenth of a list?你如何获得每十分之一列表的平均值?
【发布时间】:2018-12-24 08:54:01
【问题描述】:

我确定这有一个 numpy 函数,我只是还没有找到它。假设您有一个任意大小的整数列表。如何将其转换为包含十个浮点数的列表,其中每个浮点数是原始列表十分之一的平均值?

编辑:我能想到的最好办法是首先将列表转换为 numpy 数组,然后使用 .array_split(array, 10) 将其分成相等的部分,然后取每个部分的平均值。但我想必须有一种更简单的方法来做到这一点。

【问题讨论】:

  • 编辑了我的问题。
  • 如何更容易?你的意思是对自己还是对电脑更轻松?
  • 酷,我不知道你可以像这样同时取几个列表的平均值。

标签: python numpy


【解决方案1】:

你所描述的实际上是一个单行:

np.mean(np.array_split(array, 10), axis=0)

array_split 适用于任何“类数组”,包括列表,因此“将列表转换为 numpy 数组”是自动的。

np.mean 也适用于任何“类数组”,包括array_split 返回的数组列表,被视为二维数组,因此“… of each one”也是自动的。

所以这就是它的全部。


请注意,虽然 NumPy 文档中到处都使用“类数组”,但据我所知,它从未在任何地方严格定义过。但它的基本意思是:如果你可以调用np.array(x) 并取回你天​​真希望的数组,那么x 是类似数组的。 This question 有一个深入研究 NumPy 源代码的答案,以准确展示如何处理类似数组的值。

还要注意,一些 NumPy 函数实际上并没有说明它们期望的类型。例如,mean 明确表示a 需要一个array_like,但array_split 没有说明它需要什么(如果您尝试通过指向split 的链接进行猜测,您会猜到错误的)。因此,有时,找出类似数组的唯一方法是测试它是可以接受的。但这是一个微不足道的测试,所以没什么大不了的。


当然,如果您不想使用 NumPy,则不必; 直接在列表上做并不难;你只需要明确的循环:

chunksize = len(array) // 10
chunks = (array[i*chunksize:(i+1)*chunksize] for i in range(10))
means = [statistics.mean(chunk) for chunk in chunks]

当然,如果您愿意,您可以将所有内容折叠成一个可怕的单行代码——或者,更好的是,将前两行封装在一个与 array_split 执行相同操作的函数中,这样您就可以做:

means = [statistics.mean(chunk) for chunk in my_array_split(array, 10)]

...它看起来与 NumPy 单行代码没有什么不同,它只是使循环更加明确。

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 2018-11-22
    • 2012-03-18
    • 2022-08-14
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多