Уведомления

Группа в Telegram: @pythonsu

#1 Май 3, 2010 12:20:48

cannibale
От:
Зарегистрирован: 2010-04-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Сдвиг значений в матрице

есть матрица 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)

Офлайн

#2 Май 3, 2010 19:28:41

cannibale
От:
Зарегистрирован: 2010-04-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Сдвиг значений в матрице

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

# -*- 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)

Офлайн

#3 Май 3, 2010 21:49:25

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Сдвиг значений в матрице

А чего это у вас в первом посте матрица 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)
Кстати, в отличие от вашего будет работать и с другими размерами матрицы.



Офлайн

#4 Май 4, 2010 08:51:12

cannibale
От:
Зарегистрирован: 2010-04-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Сдвиг значений в матрице

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)
Кстати, в отличие от вашего будет работать и с другими размерами матрицы.
Спасибо, испробую ваш вариант.
пока такие конструкции сложноваты для понимания и реализации самостоятельно.



Офлайн

#5 Май 4, 2010 10:44:32

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Сдвиг значений в матрице

Идея в моем методе простая - перевернуть матрицу, получаем вместо столбцов строки, по ним легче итерировать. Потом поджимаем и переворачиваем обратно.

Вот то же самое, но более понятно:

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 и так далее.



Офлайн

#6 Май 6, 2010 07:51:48

cannibale
От:
Зарегистрирован: 2010-04-20
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Сдвиг значений в матрице

понравился способ переворачивания на 90 градусов для операций с матрицей. возьму на вооружение
а вот как поступить если нужно то же самое делать с диагоналями?
есть ли подобный способ повернуть матрицу на 45 градусов? :)
чтобы из




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







Отредактировано (Май 6, 2010 08:04:31)

Офлайн

#7 Май 6, 2010 20:33:13

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Сдвиг значений в матрице

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)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version