Форум сайта python.su
есть матрица 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()
Отредактировано (Май 3, 2010 13:19:17)
Офлайн
после некоторого времени обдумывания и логических умозаключений
вышло следующее
# -*- 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]]
Отредактировано (Май 3, 2010 19:30:53)
Офлайн
А чего это у вас в первом посте матрица 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Спасибо, испробую ваш вариант.
А чего это у вас в первом посте матрица 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)
Офлайн
Идея в моем методе простая - перевернуть матрицу, получаем вместо столбцов строки, по ним легче итерировать. Потом поджимаем и переворачиваем обратно.
Вот то же самое, но более понятно:
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) # теперь получившийся сжатый список преобразовываем обратно в матрицу и переворачиваем
Офлайн
понравился способ переворачивания на 90 градусов для операций с матрицей. возьму на вооружение
а вот как поступить если нужно то же самое делать с диагоналями?
есть ли подобный способ повернуть матрицу на 45 градусов? :)
чтобы из
получилось чтото типа
Отредактировано (Май 6, 2010 08:04:31)
Офлайн
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)
Офлайн