2015-04-30 2 views
1

У меня все еще возникают проблемы, приспосабливающиеся к «более питонским способам» написания кода иногда ... прямо сейчас я повторяю некоторые значения (x). У меня много массивов, и я всегда сравниваю первое значение всех массивов, второе значение ... коротко: среднее значение всех записей в массиве по положению в массиве.Подробнее pythonian путь для получения среднего значения массива

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), но, наверное, я пропустил серьезную магию таким образом.

+0

Вы можете добавить пример 'int_points' и' x'? – philshem

+0

Во-первых, самый пифонический способ получить среднее значение - это, вероятно, вызов ['statistics.mean'] (https://docs.python.org/3/library/statistics.html#statistics.mean), если у вас есть какой-то Python повторяется как метод «list» или ['ndarray.mean'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html#numpy.mean) если у вас на самом деле есть (NumPy) массивы. – abarnert

ответ

-1

Вы имеете в виду что-то вроде

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] 
+0

Смешивание NumPy и итерация, как это, как правило, не очень хорошая идея. Как только вы принесете NumPy, вы можете сделать все в NumPy намного проще (и эффективно, если это имеет значение), как показывает ответ [simleo] (http://stackoverflow.com/a/29963570/908494). – abarnert

3

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

Очевидный способ сделать это - использовать 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 только в STDLIB в 3.4+, но он основан на stats на PyPI, и если yur Python слишком стар, даже для этого, вы можете написать его самостоятельно. Получение ошибки обработки прямо на крайние случаи сложно, так что вы, вероятно, хотите взглянуть на код из statistics, но если вы дело только со значениями около 1, вы можете просто сделать это очевидным образом:

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

+1 Ты избил меня до того же самого ответа. Я почти писал в разделе 'zip (* arrs)'. Как ни странно, я использовал то же самое имя переменной 'arrs'! – ComputerFellow

+1

@ComputerFellow: в прошлый час было как минимум 5 вопросов, где «zip» был ядром ответа, и по крайней мере 2 из них использовали «arrs» в качестве имени переменной (и все они назывались «массивы» «несмотря на то, что на самом деле есть списки), может быть, поэтому и в обеих наших головах? – abarnert

6

Используйте пакет 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]) 
0
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) 
+1

Вопрос гласит: «У меня много массивов». Таким образом, ответ, который не масштабируется до более чем 2, вероятно, не помогает. – abarnert

+0

Твой истинный я неправильно понял вопрос. –