Подтвердить что ты не робот

Список усреднений списков python

У меня есть список списков: что-то вроде:

data = [[240, 240, 239],
        [250, 249, 237], 
        [242, 239, 237],
        [240, 234, 233]]

И я хочу усреднить это, например

[average_column_1, average_column_2, average_column_3]

Моя часть кода похожа на не очень элегантную. Это наивный способ перехода через список, сохранение суммы в отдельном контейнере, а затем деление на количество элементов.

Я думаю, что есть питонический способ сделать это. Какие-либо предложения? Благодаря

4b9b3361

Ответ 1

Pure Python:

from __future__ import division
def mean(a):
    return sum(a) / len(a)
a =  [[240, 240, 239],
      [250, 249, 237], 
      [242, 239, 237],
      [240, 234, 233]]
print map(mean, zip(*a))

Печать

[243.0, 240.5, 236.5]

NumPy:

a = numpy.array([[240, 240, 239],
                 [250, 249, 237], 
                 [242, 239, 237],
                 [240, 234, 233]])
print numpy.mean(a, axis=0)

Python 3:

from statistics import mean
print(*map(mean, zip(*a))

Ответ 2

data = [[240, 240, 239],
        [250, 249, 237], 
        [242, 239, 237],
        [240, 234, 233]]
avg = [float(sum(col))/len(col) for col in zip(*data)]
# [243.0, 240.5, 236.5]

Это работает, потому что zip(*data) предоставит вам список с разбитыми столбцами, вызов float() необходим только для Python 2.x, который использует целочисленное деление, если не используется from __future__ import division.

Ответ 3

Используйте zip(), например:

averages = [sum(col) / float(len(col)) for col in zip(*data)]

zip() принимает несколько повторяющихся аргументов и возвращает срезы этих итераций (в виде кортежей), пока один из повторений не сможет вернуть ничего больше. Фактически, он выполняет операцию транспонирования, аналогичную матрицам.

>>> data = [[240, 240, 239],
...         [250, 249, 237], 
...         [242, 239, 237],
...         [240, 234, 233]]

>>> [list(col) for col in zip(*data)]
[[240, 250, 242, 240],
 [240, 249, 239, 234],
 [239, 237, 237, 233]]

Выполняя sum() на каждом из этих фрагментов, вы фактически получаете сумму столбца. Просто разделите по длине столбца, чтобы получить среднее значение.

Боковая точка: в Python 2.x деление на целые числа по умолчанию десятичное по умолчанию, поэтому float() вызывается для "продвижения" результата к типу с плавающей точкой.

Ответ 4

import numpy as np

data = [[240, 240, 239],
        [250, 249, 237], 
        [242, 239, 237],
        [240, 234, 233]]

np.mean(data, axis=0)
# array([ 243. ,  240.5,  236.5])

Кажется, работает.