Как изменить столбец в строку в матрице?

#python #numpy

#python #numpy

Вопрос:

На входе у нас есть матрица с любым количеством строк и столбцов, например:

 1 2 3
4 5 6
7 8 9
 

В выводе должно быть:

 1 4 7 8 9
0 2 5 6 0
0 0 3 0 0
 

Я пытался писать код, но у меня было много ошибок, чувствую, что я выбрал неправильный путь и все мои исследования неверны. Как решить эту задачу?

Я студент, и мой учитель дал мне эту задачу, это было неожиданно, потому что я тренировался в codewars и забыл изучить matrix и numpy, у меня есть 2 часа, может кто-нибудь мне помочь?

Комментарии:

1. Существует ли алгоритм для создания этой матрицы? или каковы шаги для достижения решения?

2. Опубликуйте свою попытку здесь.

3. на входе у нас есть текстовый файл «input.txt «с любой матрицей в форме, которую я написал, здесь нет создания алгоритмов, мы просто записываем матрицу в текстовый файл и проверяем, работает наш код или нет. И на выходе должен быть новый текстовый файл «output.txt » с новой матрицей (результат).

Ответ №1:

Вам нужно получать внешние значения на каждой итерации.

введите описание изображения здесь

Например, сначала вам нужно получить значения розовых стрелок, затем красные, затем остальные значения.

Сначала вам нужно создать матрицу от 1 до 10.

 A = np.arange(1, 10).reshape(3, 3)
 

Затем, используя рекурсию, вы будете принимать внешние значения, для этого вы можете использовать counter ( cnt ):

 import numpy as np


def get_mat(mat, cnt, col):

    if cnt == mat.shape[0]:
        return col

    for i in range(cnt):
        col.append(0)

    for i in range(0, len(mat) - cnt):
        m = mat[i]
        col.append(m[cnt])

    for r in m[cnt 1:]:
        col.append(r)

    for i in range(cnt):
        col.append(0)

    return get_mat(mat, cnt 1, col)


A = np.arange(1, 10).reshape(3, 3)

cols = []

res = get_mat(A, 0, cols)

res = np.reshape(res, (3, 5))
print(res)
 

Результат:

 [[1 4 7 8 9]
 [0 2 5 6 0]
 [0 0 3 0 0]]
 

Ответ №2:

ЧЕРТ!! Я немного опаздываю на вечеринку.Попробуйте это. a = (np.r_[t[0:rows-i,i],t[rows-1-i,i 1:]]) это суть кода.Который принимает внешние значения матрицы и объединяет их на каждой итерации. затем дополните массив 0s.

 import numpy as np
t=np.array([[1, 2, 3],
            [4 ,5 ,6],
            [7, 8 ,9]])
result = []
rows,columns = t.shape
for i in range(rows):
    a = np.r_[t[0:rows-i,i],t[rows-1-i,i 1:]]
    pad = int(((rows columns)-1-len(a))/2)
    a = np.pad(a,(pad,pad), 'constant', constant_values=(0,0))
    result.append(list(a))
print(result)
 

вывод

 [[1, 4, 7, 8, 9], [0, 2, 5, 6, 0], [0, 0, 3, 0, 0]]
 

для ввода

 t=np.array([[1, 2, 3,4],
            [4 ,5 ,6,10]])
 

вывод

 [[1, 4, 5, 6, 10], [0, 2, 3, 4, 0]]
 

Ответ №3:

Полный код

 input_array=[[1,2,3],[4,5,6],[7,8,9]] #input array
row=len(input_array) #no of rows in array
col=len(input_array[0]) #no of columns in array
for i in range(0,col): #iterating for each head value
    turn=row-i
    for j in range(0,turn): #itearing and taking turn
        if j==0:
            for l in range(i): #for printing zeros in the beginning 
                print(0,end=" ")   
        if j<=row:
            print(input_array[j][i],end=" ")
        if j==turn-1: #taking turn
            for k in range(i 1,row):
                print(input_array[j][k],end=" ")
            for l in range(i): #for printing zeros in the beginning
                print(0,end=" ")
    print("n")  #line break
 

ВЫВОД

введите описание изображения здесь

Я прокомментировал код для вашего удобства. Если у вас есть какие-либо вопросы относительно кода, не стесняйтесь спрашивать.

Комментарии:

1. что такое «inm» в операторе «if j<=col:»?

2. @Albert Hofmann Это был входной массив, который я забыл удалить. Теперь я отредактировал код, вы найдете входной массив как «input_array».

Ответ №4:

Попробуйте это:

 l=[[1,2,3],[4,5,6],[7,8,9]]
r=[]
for j in range(len(l[0])):
    r.append([])
    r[j].extend([0 for i in range(j)])
    r[j].extend([l[i][0]  for i in range(0,len(l))])
    r[j].extend([l[-1][i] for i in range(1,len(l))])
    r[j].extend([0 for i in range(j)])
    l=[[i for i in l[k][1:]] for k in range(len(l)-1)]
print(r) 
 

Результат

 [[1,4,7,8,9],
 [0,2,5,6,0],
 [0,0,3,0,0]]
 

Ответ №5:

 
def rearrange(input_str):
    src = [list(map(int, i.split())) for i in input_str.split('n')]
    mx, sumdata = len(src), []
    for index, (ix, iy) in enumerate(zip(range(mx), range(mx - 1, -1, -1))):
        data = ([0] * index)   list(range(src[0][ix], src[iy][ix], mx))
        data.extend((*range(src[iy][ix], src[iy][mx - 1]   1), *([0] * index)))
        sumdata.append(data)
    return sumdata


>>> print(data1)
1 2 3
4 5 6
7 8 9
>>> print(data2)
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
>>> pprint.pprint(rearrange(data1))
[[1, 4, 7, 8, 9], [0, 2, 5, 6, 0], [0, 0, 3, 0, 0]]
>>> pprint.pprint(rearrange(data2))
[[0, 4, 8, 12, 13, 14, 15],
 [0, 1, 5, 9, 10, 11, 0],
 [0, 0, 2, 6, 7, 0, 0],
 [0, 0, 0, 3, 0, 0, 0]]

 

Получите поворотную точку через обратный цикл
Перемещение вертикальных данных, перемещение горизонтальных данных

Ответ №6:

Если ваша матрица представляет собой квадратную матрицу, то

 In [39]: a = [[1, 2, 3],
    ...:      [4, 5, 6],
    ...:      [7, 8, 9]]
    ...: 
    ...: print(*([0 for j in range(i)]  
    ...:         [a[j][i] for j in range(len(a)-i)]  
    ...:         [a[len(a)-1-i][j] for j in range(i 1,len(a))]  
    ...:         [0 for j in range(i)]
    ...:             for i in range(len(a))), sep='n')
[1, 4, 7, 8, 9]
[0, 2, 5, 6, 0]
[0, 0, 3, 0, 0]

In [40]: 
 

трюк