Как преобразовать диагонали хранящиеся в массиве обратно в матрицу?
Имеется матрица, она может быть любого размера.
Ниже я использую тестовую матрицу.
arr1 = [ [1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]]
я выделяю в ней диагонали по методике ниже, где каждый отдельный цвет это вид диагонали
Подробнее методы как находить такие диагонали описано вот здесь
Для нахождения я пользуюсь данной функцией:
def find_diag_values(mtrx):
n, m = len(mtrx), len(mtrx[0])
left_ans = []
right_ans = []
start_coords = [(y, 0) for y in reversed(range(0, n, 2))]
start_coords += [(0, x) for x in range(1, m)]
for s_y, s_x in start_coords:
x = s_x
left = []
right = []
for y in range(s_y, n, 2):
if x >= m:
break
left.append(mtrx[y][x])
left.append(mtrx[y + 1][x])
right.append(mtrx[y][-(x + 1)])
right.append(mtrx[y + 1][-(x + 1)])
x += 1
left_ans.append(left)
right_ans.append(right)
return left_ans, right_ans
И тут соответственно вызываю её:
arr1 = [ [1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]]
vertical_diags_values = find_diag_values(arr1)
horizontal_diags_values = find_diag_values(arr1)))
print("lft_rght", vertical_diags_values[0], "\n", sep="\n", end="")
print("rght_lft", vertical_diags_values[1], "\n", sep="\n", end="")
print("top_btm ", horizontal_diags_values[0], "\n", sep="\n", end="")
print("btm_top ", horizontal_diags_values[1], "\n", sep="\n", end="")
Вот результат:
lft_rght
[[17, 21], [9, 13, 18, 22], [1, 5, 10, 14, 19, 23], [2, 6, 11, 15, 20, 24], [3, 7, 12, 16], [4, 8]]
rght_lft
[[20, 24], [12, 16, 19, 23], [4, 8, 11, 15, 18, 22], [3, 7, 10, 14, 17, 21], [2, 6, 9, 13], [1, 5]]
top_btm
[[17, 21], [9, 13, 18, 22], [1, 5, 10, 14, 19, 23], [2, 6, 11, 15, 20, 24], [3, 7, 12, 16], [4, 8]]
btm_top
[[20, 24], [12, 16, 19, 23], [4, 8, 11, 15, 18, 22], [3, 7, 10, 14, 17, 21], [2, 6, 9, 13], [1, 5]]
Далее я провожу работу над диагоналями и получаю вот такой результат для одного вида диагоналей:
lft_rght
[[0, 0], [0, 1, 2, 3], [0, 0, 10, 14, 0, 0], [0, 0, 11, 15, 20, 0], [0, 0, 12, 0], [0, 0]]
Для каждого массива диагоналей значения могут быть разными.
Как мне преобразовать массив диагоналей обратно в матрицу для каждого вида диагоналей?
Что бы получить матрицу оригинального размера со своими значенями.
Вот примера того как должно выглялдеть обратное преобразование.
arr2 = [ [0, 2, 0, 0],
[0, 6, 0, 0],
[0, 10, 11, 12],
[1, 14, 15, 0],
[0, 2, 0, 20],
[0, 3, 0, 0]]