Python:快速计算多个(相同长度)列表的平均值的方法?

16

有没有一种简单的方法在Python中计算多个(长度相同)列表的平均值?例如,我有[[1, 2, 3], [5, 6, 7]],想获取[3,4,5]。需要进行100000次操作,因此希望速度快。


1
你如何获得第一个元素的值为4 - NPE
3
在这里,NumPy数组比纯Python更快。否则,除了直接执行之外,确实没有什么“快速”的方法。而且100000次并不是那么多。 - Lennart Regebro
@LennartRegebro:我刚刚进行了一些基准测试,对于这样一个小的输入,numpy.average()比简单的列表推导式慢10倍。相当令人惊讶。 - NPE
@NPE 我确实是指NumPy(已更正)。而且,这一点一点都不令人惊讶。关键在于他有一个数组,并且“纵向”地对其进行切片。NumPy有可以做到这一点的Array对象,而在Pure Python中,您有的是列表中的列表。当他说“100000”时,我认为他是指数组的大小。 - Lennart Regebro
4个回答

31

如果您使用 numpy (在这种情况下似乎更合适):

>>> import numpy as np
>>> data = np.array([[1, 2, 3], [5, 6, 7]])
>>> np.average(data, axis=0)
array([ 3.,  4.,  5.])

https://dev59.com/dGIj5IYBdhLWcg3wn2do - PatrickT

6
In [6]: l = [[1, 2, 3], [5, 6, 7]]

In [7]: [(x+y)/2 for x,y in zip(*l)]
Out[7]: [3, 4, 5]

您需要决定是使用整数还是浮点数进行数学计算,并选择要使用的除法类型。

在我的计算机上,以上操作需要1.24微秒:

In [11]: %timeit [(x+y)/2 for x,y in zip(*l)]
1000000 loops, best of 3: 1.24 us per loop

因此,处理 100,000 个输入需要 0.124 秒。

有趣的是,在这样小的输入上,NumPy 数组比较慢:

In [27]: In [21]: a = np.array(l)

In [28]: %timeit (a[0] + a[1]) / 2
100000 loops, best of 3: 5.3 us per loop

In [29]: %timeit np.average(a, axis=0)
100000 loops, best of 3: 12.7 us per loop

如果输入变得更大,相关的时间肯定会改变。


假设他有两个包含100000个项目的列表。虽然可能会这样解释问题,但我不确定这是否是他想要的。 - Lennart Regebro
1
对我来说,“这要做100000次”意味着许多输入而不是长输入。然而,我们肯定需要OP对此进行澄清。 - NPE

2
扩展NPE的答案,如果您有一个包含n个子列表且想要求平均值的列表,请使用以下代码(numpy解决方案可能更快,但我的方法仅使用内置函数):
def average(l):
    llen = len(l)
    def divide(x): return x / llen
    return map(divide, map(sum, zip(*l)))

这段代码会将所有子列表求和,然后除以子列表数量,得到平均值。你可以将len计算内联,并将divide转换为lambda表达式,如lambda x: x / len(l),但使用显式函数并预先计算长度应该会更快一些。

0

稍作修改以便与RGB像素平稳工作的版本:

def average(*l):
  l=tuple(l)
  def divide(x): return x // len(l)
  return list(map(divide, map(sum, zip(*l))))
print(average([0,20,200],[100,40,100]))
>>> [50,30,150]

请添加更多细节以扩展您的答案,例如工作代码或文档引用。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接