Функция скользящего среднего - PullRequest
0 голосов
/ 16 апреля 2020

Я изучаю Python, и одно из упражнений из курса, который я беру, состоит в том, чтобы создать функцию, которая вычисляет скользящее среднее для всех элементов в векторе с учетом окна элементов. Единственные исключительные случаи - около краев, где не хватает соседей, тогда значение ребра должно быть повторено. Я написал следующую функцию, которая не работает:

%reset -f
def moving_window_average(x, n_neighbors):
    mavg=[]
    i=0
    while i<=len(x):
        sumv=[x[i]]
        j = n_neighbors
        while j>0:
            if  (i-j)<0:
                sumv.append(x[i])
                sumv.append(x[i+j])
                j-=1
            elif (i+j)>len(x):
                sumv.append(x[i])
                sumv.append(x[i-j])
                j-=1
            else:
                sumv.append(x[i-j])
                sumv.append(x[i+j])
                j-=1
        mavg_i=sum(sumv)/len(sumv)
        mavg.append(mavg_i)
        i+=1
    return mavg
x = [0,10,5,3,1,5]
print(moving_window_average(x, 1))

Но когда я запускаю построчно, она работает (как показано ниже), она прекрасно работает для меня

mavg=[]
i=0
#while i<=len(x):
i<=len(x)
sumv=[x[i]]
j=1
#while j>0
j>0
#
(i-j)<0
sumv.append(x[i])
sumv.append(x[i+j])
j-=1
#
(i+j)>len(x)
sumv.append(x[i])
sumv.append(x[i-j])
j-=1
# else
sumv.append(x[i-j])
sumv.append(x[i+j])
j-=1
mavg_i=sum(sumv)/len(sumv)
mavg.append(mavg_i)
i+=1

Может кто-нибудь пожалуйста Помоги мне? Я считаю, что решение должно быть довольно простым, но я не могу понять, что не так в моей функции. Спасибо.

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

В вашем коде, когда вы используете l oop, вы делаете небольшую ошибку. Поскольку вы, как правило, находитесь в состоянии l oop и проверяете длину списка как ссылку на ограничение количества l oop, нужно быть очень осторожным. В python количество элементов начинается с нуля, поэтому вам следует остановиться перед одним значением или считать меньше, чем длина любого списка len (list).

Просто удалите знак = из внешнего, пока l oop и ваш код будет работать.

def moving_window_average(x, n_neighbors):
    mavg=[]
    i=0
    while i < len(x):
        sumv=[x[i]]
            ...
            ...

Примечание: здесь используйте для l oop, это безопаснее, чем при l oop.

1 голос
/ 16 апреля 2020

Прежде всего, у вас не должно быть while i<=len(x):, так как индекс len(x) находится вне диапазона допустимых значений в x.
У вас есть логическая ошибка c, когда сосед выпадает из массив. То есть вместо sumv.append(x[i]), когда (i-j)<0, вы должны добавить x[0]. То же самое со вторым условием, где вы должны взять последний элемент x[-1] (здесь условие должно быть (i+j) >= len(x)).
Кроме того, поскольку вы делаете курс, вы должны стремиться написать больше кода Pythoni c, попробуйте сначала заменить while на for, и посмотрите, сможете ли вы от этого тоже избавиться, потом.
Ваша сложность сейчас составляет O (N * K), где N - длина массива, а K - число соседей, оно может быть уменьшено до O (N);)

0 голосов
/ 16 апреля 2020

ты выходишь за пределы.

sumv.append(x[i+j]) IndexError: list index out of range

Вы проверяете, если i+j > len(x) Но это должно быть i+j >= len(x), поскольку индексация начинается с 0, а не с 1.

Также я вижу Вы изучаете python. Хотя ваша программа может работать, возитесь с ней, чтобы сделать ее короче: используйте циклы for для перебора списков, например

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...