2013-05-16 3 views
0

У меня есть набор точек данных, для которых я создал программу, которая будет изучать набор данных, из этого набора берутся все n точек и суммирует их и помещает в новый список , И с этим я могу сделать простые бары.Вычислить дискретное среднее в python

Теперь я хотел бы рассчитать дискретное среднее для моего нового списка.

Формулы Я использую это: t_av=(1/nsmp) Sum[N_i*t_i,{i,n_l,n_u}]
В принципе у меня есть NSMP бункеров, которые имеют N_i количества в них, t_i это время бин, и n_l является первым бин и n_u последним бункера.

Так что, если мой список таков: [373, 156, 73, 27, 16],
У меня есть 5 бункеров, и у меня есть: t_av=1/5 (373*1+156*2+73*3+27*4+16*5)=218.4

Теперь я столкнулся с проблемой. Я пытался с этим:

for i in range(0,len(L)): 
    sr_vr = L[i]*i 

tsr=sr_vr/nsmp 

Где NSMP это количество бункеров я могу установить, и я L рассчитывается. Поскольку диапазон будет идти от 0,1,2,3,4, я не получу правильный ответ, потому что мой первый бит рассчитан на 0. Если я скажу range(1,len(L)+1), я получу IndexError: list index out of range, так как это испортит часть L[i]*i так как он по-прежнему будет умножать второй (1) элемент списка на 1, а затем он будет одним кратким для последней части.

Как это исправить?

ответ

1

Вы можете использовать только L[i]*(i+1) (при условии, что вы придерживаетесь индексации с нулевой отметкой).

Однако вы также можете использовать enumerate() для цикла по индексам и значения вместе, и вы можете даже представить 1 в качестве второго аргумента, так что индексация начинается с 1 вместо 0.

Вот как я это пишу:

tsr = sum(x * i for i, x in enumerate(L, 1))/len(L) 

Обратите внимание, что если вы на Python 2.x и L содержит полностью целые числа это будет выполнять целочисленное деление. Чтобы получить float, просто преобразуйте один из аргументов в float (например, float(len(L))). Вы также можете использовать from __future__ import division.

+0

Ваша вторая версия работает, а L [i] * (i + 1) дает неправильный ответ. Я бы не подумал об этом втором способе, который прекрасно работает. Я соглашусь на это через 8 минут: D Btw Я все еще dk, почему этот простой цикл работает неправильно: \ EDIT: У меня есть 'от __future__' часть :) –

+1

Вы переназначаете новое значение' sr_vr' on каждая итерация, когда вы хотите сохранить общую сумму. Поэтому вы должны поставить 'sr_vr = 0' перед циклом, а затем внутри цикла вы будете использовать' sr_vr + = L [i] * (i + 1) '. –

+0

О, да! Спасибо за помощь, очень благодарен :) –

Смежные вопросы