2013-02-10 3 views
1

Ниже приведено определение частичного класса для карты 2D изометрических плит, которые будут отображаться с использованием пиглета.Как ускорить итерацию через этот преобразованный массив numpy?

class Map(object): 

    origin = 0 
    drytile = tile.dry 
    wettile = tile.wet 

    def __init__(self, left=8, right=8): 
     self.grid = np.array(([None] * left, [None] * right), dtype=object) 
     self._setup_grid() 

    def __iter__(self): 
     """return tiles in the order in which they should be rendered""" 
     # get number of diagonals 
     ndiags = (np.max(self.grid.shape) * 2) -\ 
       (1 + (np.max(self.grid.shape) - np.min(self.grid.shape))) 

     # get iterator to go through diagonals in back-to-front order 
     offsets = xrange(-(ndiags/2), ndiags/2 + 1) 

     # iterate in render order 
     for off in offsets: 
      for tile in np.flipud(self.grid).diagonal(off)[::-1]: 
       yield tile 

Эти плитки должны быть оказаны назад к фронту, в соответствии с этой схемой:

Tile render order. Origin is at the top corner

В моем определении класса, происхождение относится к самой верхней плитки (плитки a) , поэтому размер left, определенный в классе, представляет собой вектор вдоль [a b d g], а размер right представляет собой вектор вдоль [a c f j].

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

Большое спасибо!

ответ

0

Я бы заказал структуру данных в первую очередь. Если вы закажете вектор, то итерация будет быстрее.

В целом использование упорядоченных структур данных подходит для такого рода вещей.

Если вы манипулируете структурой по какой-либо причине, вам необходимо выполнить «Упорядоченный-вставить» или удаление, которое происходит медленнее. Компромисс для использования упорядоченных структур данных находится на вставке и удалении, и поскольку плата не должна сильно меняться, похоже, вы можете использовать только с упорядоченными структурами данных.

+0

Вы говорите о 'np.flipud (self.grid) .diagonal (off) [:: - 1]' statement? Если это так, мне не сразу становится очевидным, как упорядочить массив. Есть ли у вас какие-либо предложения? – blz

Смежные вопросы