Список усреднений списков python
У меня есть список списков:
что-то вроде:
data = [[240, 240, 239],
[250, 249, 237],
[242, 239, 237],
[240, 234, 233]]
И я хочу усреднить это, например
[average_column_1, average_column_2, average_column_3]
Моя часть кода похожа на не очень элегантную.
Это наивный способ перехода через список, сохранение суммы в отдельном контейнере, а затем деление на количество элементов.
Я думаю, что есть питонический способ сделать это.
Какие-либо предложения?
Благодаря
Ответы
Ответ 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])
Кажется, работает.