#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]:
трюк