2016-10-26 2 views
0

У меня есть данные с координатами (x, y), которые начинаются в левом углу. Я перехожу в матрицу с индексами, начиная с 0, что выглядит так:реверсирование строк для индексов, python

| 0 | 1 | 2 | 3 | 4| 
| 5 | 6 | 7 | 8 | 9| 
|10 |11 |12 |13 |14| 
|15 |16 |17 |18 |19| 
|20 |21 |22 |23 |24| 

, например, (х, у) = (1,4) ID = у * 5 + х = 21. Но я хочу его происхождение в левом дне, так что я получаю матрицу с такими индексами:

| 20| 21| 22| 23| 24| 
| 15| 16| 17| 18| 19| 
| 10| 11| 12| 13| 14| 
| 5 | 6 | 7 | 8 | 9| 
| 0 | 1 | 2 | 3 | 4| 

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

ответ

0

Я не знаю, как вещий это, но он отлично работает

for i in len(v)//2: 
     v[i], v[-i] = v[-i], v[i] 
0

Обратный массив по x

>>> M = [[0,1,2],[3,4,5],[6,7,8],[9,10,11]] 
>>> M[::-1] 
[[9, 10, 11], [6, 7, 8], [3, 4, 5], [0, 1, 2]] 
0

Используйте либо list(reversed(x)) или x[::-1] как:

matrix=[[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14],[15,16,17,18,19]] 
backwards=matrix[::-1] 
inverted=list(reversed(matrix)) 

reversed возвращает обратный итератор, который list преобразует в список, а [::-1] возвращает список сплайсинга, возвращающего элементы назад.

1

Я не уверен, о том, «вещий» или нет, но самый прямой и эффективный способ для меня это просто просто:

u = [v[5 * (len(v) // 5 - i // 5 - 1) + i % 5] for i in xrange(len(v))]

EDIT:

Если вы чувствуете себя неуютно об этих подразделениях и модулях, альтернатива без какого-либо математического расчета (но может быть менее эффективным):

sum([v[i: i+5] for i in xrange(0, len(v), 5)][::-1], [])

0

Когда форма вашей матрицы width, height = 5, 5, общая формула, чтобы получить снизу вверх индекс из индекса списка является:

width*(height-index//height-1)+index%height 
Смежные вопросы