В 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


Ответы (0 шт):