Доступ к позиции [i-1] массива в Python - Фильтр

Я пытаюсь настроить фильтр на Python, и я застрял в базовых вещах.

Это функция, которую я должен реализовать:

y[n] = (1 − λ) · x[n] + λ · y[n − 1]

Я читаю m-файл и применяю фильтр.

Вот код:

import sys
import numpy as np
import matplotlib.pyplot as plt

y = np.loadtxt('acs712_192us.m')
size = len(y)

x = np.arange(0, size)

out = []

lamb = 0.9 

for i in range(0, len(y)):
    out.append(((1-lamb) * y[i]) + (lamb * out[i - 1]))

plt.plot(x, y)
plt.plot(x, out)
plt.show()

Когда я запускаю эту программу, получаю следующую ошибку:

File "main_LI.py", line 15, in out.append(((1-lamb) * y[i]) + (lamb * out[i - 1])) IndexError: list index out of range

Я знаю, что не могу получить доступ к позиции [-1] (в первом цикле), может быть, это проблема?

У кого-нибудь есть советы?

Спасибо вам, ребята!

что содержит ваш м файл?

lmiguelvargasf 22.05.2018 18:25

Кажется, что ваша повторяющаяся связь не имеет отправной точки.

user2357112 supports Monica 22.05.2018 18:25

Я сомневаюсь, что для начала в out должно быть начальное значение.

Austin 22.05.2018 18:27

Это файл .txt с 512 значениями (0–511). Я могу получить y [i]

Matheus Bernardi 22.05.2018 18:28

Что сказал user2357112. Какой должен быть out[0]?

PM 2Ring 22.05.2018 18:28

@MatheusBernardi, что такое out[0]?

lmiguelvargasf 22.05.2018 18:31

out [0] = (1 - 0,9) * y [0] + 0,9 * out [-1] Мне нужно игнорировать этот первый цикл (я полагаю), потому что этот доступ выходит [-1]

Matheus Bernardi 22.05.2018 18:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
140
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, вы можете использовать отрицательные показатели в Python. Проблема в том, что вы указываете несуществующий индекс.

out изначально представляет собой пустой список, поэтому проблема в том, что вы пытаетесь получить доступ к индексу, которого не существует на первой итерации:

import sys
import numpy as np
import matplotlib.pyplot as plt

y = np.loadtxt('acs712_192us.m')
size = len(y)

x = np.arange(0, size)

out = []

lamb = 0.9 

for i in range(len(y)):
    if i == 0:
       out.append(value) # value is what you want out[0] to be
    else:
        out.append(((1-lamb) * y[i]) + (lamb * out[i - 1]))

plt.plot(x, y)
plt.plot(x, out)
plt.show()

Оно работает! Спасибо за помощь, извините, если вопрос был дурацким.

Matheus Bernardi 22.05.2018 18:36

Для этого можно довольно легко использовать составление списков.

l = 0.9
x = np.arange(0, 10)
filtered = [x[i] if i == 0 else (1-l)*x[i] + l*x[i-1] for i in range(0,len(x))]

>>> print(filtered)
[0, 0.09999999999999998, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1000000000000005, 7.1, 8.1]

это тот результат, которого вы ожидаете?

Это тоже поможет! Спасибо

Matheus Bernardi 22.05.2018 18:39

Другие вопросы по теме