В Python перебрать массивы, один из которых в 2 раза короче первого
У меня есть списки значений x_i, x_j (в таблице ниже этот столбик здесь не приведен) и список значений y. Также имеется список списков string_all: в него сложены строки значений дельт (в таблице первые две строки для наглядности подчеркнуты цветом) - с первой строчки до последней (где имеется хотя бы одна дельта).
Это часть более длинного кода приближения функций. Передо мной стоит задача выбрать строку с дельтами (через логику в переменной k). Далее со строкой проводятся свои манипуляции(их здесь нет: вопрос в другом).
Итак: мы движемся вниз по спискам иксов, и в при сопоставлении индексов исходного списка x_i_list выбираем ту или иную строку дельт по индексу k.
Проблема: я застрял на пункте 8 кода - у меня перебор останавливается на нуле (а отрицательный k дает лишь последнюю строку дельт). Перебора не получается. Как быть?
Выход такой:
0 [-0.3090169943749474]
Код:
import numpy as np
from itertools import zip_longest
# 1) определяем исходную функцию для построения списка x_i_list
def func(x):
return np.sin(x)
# 2) определяем список значений x_i
x_i_list = [(0.1*np.pi*i) for i in range(0, 11)]
# 3) определяем список значений y
y_i_list = []
for x in x_i_list:
y_i = (func(x))
y_i_list.append(y_i)
# 4) определяем список значений x_j
x_j_list = [(0.05*np.pi*j) for j in range(0, 21)]
# 5) задаем порядок полинома: пусть будет равным трем
order = 3
num=len(x_i_list)
# 6) строим дельты (конечные разности)
if order < len(y_i_list):
result_1 = [ np.diff(y_i_list, n=d) for d in np.arange(1, len(y_i_list)) ]
else:
print(f'Определите порядок полинома меньше {len(y_i_list)}')
# 7) получаем список списков с дельтами
string_all = [list(filter(lambda x: x is not None, el)) for el in zip_longest(*result_1)]
# 8) начинаем цикл для работы со списками x_i_list и x_j_list
point_elem_i = 0
point_elem_j = 0
# определяем счетчик для движения по списку x_i_list (т.к. он в 2 раза короче списка X_j_list)
counter = 1
# пока индексы в обеих сетках не достигли длины списков:
while point_elem_j < len(x_j_list) and point_elem_i < len(x_i_list):
k = min((num-1)-order, point_elem_i)
print(k) # ЕСЛИ k=0, ТО (K-1)=(0-1)=-1, ТО ЕСТЬ ПОСЛЕДНИЙ ЭЛЕМЕНТ
string_one_1 = string_all[k-1]
print(string_one_1)
point_elem_j += 1
counter +=1
if counter%2 == 0:
point_elem_i += 1
break
