Как преобразовать диагонали хранящиеся в массиве обратно в матрицу?

Рейтинг: 0Ответов: 1Опубликовано: 21.04.2023

Имеется матрица, она может быть любого размера.

Ниже я использую тестовую матрицу.

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]]

Ответы

▲ 0Принят

Нужно преобразовать массив с массивами в список:

spis= [a for b in vertical_diags_values[0] for a in b] 
spis2 = [a for b in vertical_diags_values[1] for a in b] 
spis3 = [a for b in horizontal_diags_values[0] for a in b] 
spis4 = [a for b in horizontal_diags_values[1] for a in b]

Ниже функция для преобразования списка в матрицу работает сразу с двумя списками:

def new_mass(mtrx, spis,spis2):
    n, m = len(mtrx), len(mtrx[0])
    zero = np.zeros((n,m), dtype=int)#lft
    zero2 = np.zeros((n,m), dtype=int)#right
    left_ans = []
    right_ans = []

    count=0

    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


        for y in range(s_y, n, 2):
                if x >= m:
                    break
                zero[y][x]= spis[count]
                zero[y+1][x]= spis[count+1]
                zero2[y][-(x + 1)]=spis2[count]
                zero2[y + 1][-(x + 1)]=spis2[count+1]
                count+=2
                x += 1
    return zero, zero2

Вызов всех 4 функций:

print(new_mass(arr1,spis,spis2)[0])
print(new_mass(arr1,spis,spis2)[1])
print(np.transpose(new_mass(list(zip(*arr1)),spis3,spis4)[0]))
print(np.transpose(new_mass(list(zip(*arr1)),spis3,spis4)[1]))