Найти - Пользователи
Полная версия: Сдвиг значений в матрице
Начало » Python для новичков » Сдвиг значений в матрице
1
cannibale
есть матрица 8х7
заполнена числами и нулями, нули подразумевают свободные места.
нужно сместить все числа в матрице которые больше нуля по оси Х вниз т.е. X=8
не нашёл как это сделать стандартными функциями, написал свою.
но остался один момент, чтобы отсортировались все числа, нужно вызывать функцию несколько раз.
как сделать так чтобы она сама делала это нужное количество раз?

вот листинг:
# -*- coding: cp1251 -*-
import numpy as np

matrix1 = np.array([[0, 0, 2, 0, 0, 0, 5],
[1, 0, 1, 0, 0, 3, 0],
[0, 2, 0, 1, 0, 0, 0],
[0, 1, 0, 0, 1, 1, 0],
[0, 0, 0, 1, 0, 4, 0],
[0, 1, 1, 0, 0, 0, 0],
[6, 0, 0, 0, 5, 0, 0],
[0, 1, 0, 0, 0, 0, 0],])


def matrix_move():
for x in range(7, 0, -1):
for y in range(7):
if matrix1[x][y] == 0:
if matrix1[x-1][y] > 0:
matrix1[x][y] = matrix1[x-1][y]
matrix1[x-1][y] = 0
return matrix1

matrix_move()
cannibale
после некоторого времени обдумывания и логических умозаключений
вышло следующее

# -*- coding: cp1251 -*-
import numpy as np

matrix1 = np.array([[0, 0, 2, 0, 0, 0, 5, 0],
[1, 0, 1, 0, 0, 3, 0, 1],
[0, 2, 0, 1, 0, 0, 0, 7],
[0, 1, 0, 0, 1, 1, 0, 0],
[0, 0, 0, 1, 0, 4, 0, 0],
[0, 1, 1, 0, 0, 0, 0, 0],
[6, 0, 0, 0, 5, 0, 0, 1],
[0, 1, 0, 0, 0, 0, 0, 6]])


def matrix_move(matrix):
for d in range(8):
for x in range(7, 0, -1):
for y in range(8):
if matrix[x][y] == 0:
if matrix[x-1][y] > 0:
matrix[x][y] = matrix[x-1][y]
matrix[x-1][y] = 0
return matrix

matrix_move(matrix1)
в результате получается следующее, что собственно и было нужно

>>> 
[[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 2 0 0 0 0 0 1]
[0 1 2 0 0 3 0 7]
[1 1 1 1 1 1 0 1]
[6 1 1 1 5 4 5 6]]
по другому пока никак
Питон в процессе изучения
Ed
А чего это у вас в первом посте матрица 7x8, а во втором 8x8?
Впрочем без разницы. Вот мой вариант:
np.array([[i for i in col if not i] + [i for i in col if i]
for col in matrix1.swapaxes(0, 1)]).swapaxes(0, 1)
Кстати, в отличие от вашего будет работать и с другими размерами матрицы.
cannibale
Ed
А чего это у вас в первом посте матрица 7x8, а во втором 8x8?
Впрочем без разницы. Вот мой вариант:
np.array([[i for i in col if not i] + [i for i in col if i]
for col in matrix1.swapaxes(0, 1)]).swapaxes(0, 1)
Кстати, в отличие от вашего будет работать и с другими размерами матрицы.
Спасибо, испробую ваш вариант.
пока такие конструкции сложноваты для понимания и реализации самостоятельно.
Ed
Идея в моем методе простая - перевернуть матрицу, получаем вместо столбцов строки, по ним легче итерировать. Потом поджимаем и переворачиваем обратно.

Вот то же самое, но более понятно:
squeezed = []
for column in matrix1.swapaxes(0, 1):
nonzeros = [i for i in column if i] # получаем ненулевые значения колонки
zeros = [i for i in column if not i] # получаем нули
squeezed.append(zeros + nonzeros) # добавляем в результат одну строку (бывший столбец) в нужном виде - сначала нули, потом ненули
result = np.array(squeezed).swapaxes(0,1) # теперь получившийся сжатый список преобразовываем обратно в матрицу и переворачиваем
Вообще по хорошему это все можно сделать через numpy, только нужно его знать :)
Вот, например, вместо можно применить вот это: column и так далее.
cannibale
понравился способ переворачивания на 90 градусов для операций с матрицей. возьму на вооружение
а вот как поступить если нужно то же самое делать с диагоналями?
есть ли подобный способ повернуть матрицу на 45 градусов? :)
чтобы из




получилось чтото типа





Ed
cannibale
есть ли подобный способ повернуть матрицу на 45 градусов? :)
Способ всегда есть. Проблема только найти его :)
Но в данном случае все очень просто:
import numpy as np
matrix = np.flipud(np.matrix([[1, 2, 3],[4, 5, 6],[7, 8, 9]]))
for i in xrange(-len(matrix) + 1, len(matrix)):
print np.diag(matrix, i)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB