【问题标题】:More pythonian way for getting a mean value of an array获取数组平均值的更多pythonian方式
【发布时间】:2015-07-09 21:30:47
【问题描述】:

有时我仍然无法适应“更多的pythonian方式”编写代码......现在我正在迭代一些值(x)。我有很多数组,我总是比较所有数组的第一个值,第二个值......很快:数组中所有条目的平均值,按数组中的位置。

   sum_mean_x = []
   for i in range(0, int_points):
       for j in range(0, len(x)):
           mean_x.append(x[j][i])
       sum_mean_x.append(sum(mean_x)/len(x))
       mean_x = []

我很确定可以做得超级漂亮。我知道我可以将倒数第二行更改为 sum_mean_x.append(mean_x.mean) 之类的东西,但我想我想我这样想念一些严肃的魔法。

【问题讨论】:

  • 你能添加int_pointsx的例子吗?
  • 首先,获取某事物均值的最 Pythonic 方法可能是调用 statistics.mean,如果你有某种 Python 可迭代对象,比如 list,或者如果你真的有 ndarray.mean 方法有 (NumPy) 数组。

标签: python arrays loops mean


【解决方案1】:

使用numpy 包进行数值处理。假设你在纯 Python 中有以下三个列表:

a1 = [1., 4., 6.]
a2 = [3., 7., 3.]
a3 = [2., 0., -1.]

你想得到每个位置的平均值。将向量排列在一个数组中:

import numpy as np
a = np.array([a1, a2, a3])

然后你可以像这样得到每列的平均值:

>>> a.mean(axis=0)
array([ 2.        ,  3.66666667,  2.66666667])

【讨论】:

    【解决方案2】:

    听起来您要做的是将列表列表视为二维数组,其中每个列表是一行,然后平均每一列。

    执行此操作的明显方法是使用 NumPy,使其成为实际的 2D 数组,然后按列调用 mean。请参阅simleo's answer,这比我要在此处添加的要好。 :)

    但如果你想坚持使用列表列表,按列有效意味着转置,这意味着zip

    >>> from statistics import mean
    >>> arrs = [[1., 2., 3.], [0., 0., 0.], [2., 4., 6.]]
    >>> column_means = [mean(col) for col in zip(*arrs)]
    >>> column_means
    [1.0, 2.0, 3.0]
    

    statistics.mean 仅在 3.4+ 的 stdlib 中,但它基于 PyPI 上的 stats,如果你的 Python 太旧了,你可以自己编写它。在边缘情况下正确处理错误是很棘手的,因此您可能想查看来自statistics 的代码,但如果您只处理接近 1 的值,您可以通过明显的方式进行:

    def mean(iterable):
        total, length = 0.0, 0
        for value in iterable:
            total += value
            length += 1
        return total / length
    

    【讨论】:

    • +1 你打败了我,得到了完全相同的答案。我几乎在zip(*arrs) 部分写作。奇怪的是,我使用了完全相同的变量名arrs
    • @ComputerFellow:过去一小时内至少有 5 个问题以zip 为核心答案,其中至少有 2 个使用arrs 作为变量名(以及尽管实际上有列表,但它们都提到了“数组”)所以也许这就是为什么它在我们的脑海中?
    【解决方案3】:
    ar1 = [1,2,3,4,5,6]
    ar2 = [3,5,7,2,5,7]
    
    means = [ (i+j)/2.0 for (i,j) in zip(ar1, ar2)]
    print(means)
    

    【讨论】:

    • 问题是“我有很多数组”。因此,不超过 2 的答案可能没有帮助。
    • 你的真实我误解了这个问题。
    【解决方案4】:

    你的意思是这样的

    import numpy as np    
    
    ar1 = [1,2,3,4,5,6]
    ar2 = [3,5,7,2,5,7]
    
    mean_list = []
    for i, j in zip(ar1, ar2):
        mean_list.append(np.array([i,j]).mean())
    
    print(mean_list)
    [2.0, 3.5, 5.0, 3.0, 5.0, 6.5]
    

    【讨论】:

    • 像这样混合 NumPy 和迭代通常不是一个好主意。引入 NumPy 后,您可以在 NumPy 中更简单地完成整个工作(如果这很重要,也更高效),正如simleo's answer 所示。
    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2023-01-27
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多