具有相同形状的numpy数组列表中的值的元素聚合(平均值)

时间:2018-01-11 02:47:31

标签: python arrays numpy

我有一个numpy数组列表。我想计算这些数组中的平均值。 例如:

import numpy as np
arrays = [np.random.random((4,2)) for _ in range(3)]

如何获得此数组中元素的平均值?

这就是我希望结果具有形状(4,2),其中每个元素是列表中数组的相应索引的平均值。 我知道我可以写一个for循环来实现这个目标,但应该有一个更好的numpy方式。

2 个答案:

答案 0 :(得分:2)

使用np.mean的功能形式:

>>> import numpy as np
>>> arrays = [np.random.random((4,2)) for _ in range(3)]
>>> np.mean(arrays, axis=0)

这会将您的数组列表转换为形状为(3, 4, 2)的3D数组,然后沿轴0取平均值。

您也可以使用Python的sum

>>> sum(arrays)/len(arrays)

对于像你的例子这样的小清单,这实际上更快。

某些时间安排(m是列表的长度):

m: 3   n:4   k: 2
numpy                 0.01291340 ms
python                0.00295936 ms
m: 10   n:100   k: 100
numpy                 0.14189354 ms
python                0.09465128 ms
m: 1000   n:10   k: 10
numpy                 0.43023768 ms
python                0.45201713 ms

基准代码:

import numpy as np

from timeit import timeit
import types

def setup(m, n, k):
    return list(np.random.random((m, n, k)))

def f_numpy(a):
    return np.mean(a, axis=0)

def f_python(a):
    return sum(a)/len(a)

for args in [(3, 4, 2), (10, 100, 100), (1000, 10, 10)]:
    data = setup(*args)
    print('m: {}   n:{}   k: {}'.format(*args))
    for name, func in list(globals().items()):
        if not name.startswith('f_') or not isinstance(func, types.FunctionType):
            continue
        print("{:16s}{:16.8f} ms".format(name[2:], timeit(
            'f(data)', globals={'f':func, 'data':data}, number=1000)))

答案 1 :(得分:0)

numpy nanmean将确保即使数据中存在某些缺失值也能正常工作:

np.nanmean(arrays, axis=0)