В принципе, вы хотите иметь итератор над скользящим окном. Уже есть несколько хороших сообщений по этому вопросу, доступных здесь (Итератор скользящего или скользящего окна?) .
Мы будем использовать предложенный подход Даниэля ДиПаоло:
from itertools import islice
def window(seq, n=2):
"Returns a sliding window (of width n) over data from the iterable"
" s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... "
it = iter(seq)
result = tuple(islice(it, n))
if len(result) == n:
yield result
for elem in it:
result = result[1:] + (elem,)
yield result
Теперь получить изменения легко:
xs = [1, 3, 4, 7, 10, 14]
ys = [3, 1, 2, 9, 13, -1]
# if you need the slope
w = [1/d**2
for d in
map(lambda pnts: (pnts[1][1]-pnts[0][1])/(pnts[1][0]-pnts[0][0]),
window(zip(xs, ys), 2))
]
# if you just need the change in y
w = [1/d**2
for d in
map(lambda y: y[1] - y[0], window(ys, 2))
]
Чтобы ответить на ваши изменения:
Хорошо, я добился определенного прогресса. Я думаю, что я знаю, как решить это сейчас. У меня есть список значений у. Неопределенность в каждом значении y составляет 5%. Таким образом, мне нужен новый список рассылки, который является старым списком y с периодом 0,05. Поэтому я пишу этот deltay = [(i * 0.05) для i в zip (y)] Но я получаю ошибку TypeError: невозможно умножить последовательность на не-int типа 'float' **
Вы должны использовать [(i*0.05) for i in y]
. Если вы используете zip(y)
, все записи, по которым вы перебираете, будут кортежами.