Как масштабировать сетку, хранящуюся в виде одномерного массива?

У меня есть сетка 4x4, хранящаяся как одномерный массив, каждая ячейка может содержать случайное число:

var g1 = [
  1, 0, 0, 0,
  0, 2, 0, 0,
  0, 0, 0, 3,
  0, 0, 1, 0
];

Как я могу увеличить разрешение этой сетки, чтобы получить эту сетку 8x8 в виде массива:

var g2 = [
  1, 1, 0, 0, 0, 0, 0, 0,
  1, 1, 0, 0, 0, 0, 0, 0,
  0, 0, 2, 2, 0, 0, 0, 0,
  0, 0, 2, 2, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 3, 3,
  0, 0, 0, 0, 0, 0, 3, 3,
  0, 0, 0, 0, 1, 1, 0, 0,
  0, 0, 0, 0, 1, 1, 0, 0
];

Исходный массив будет иметь разные размеры, но увеличение разрешения (от 1 до 4) будет одинаковым. Какой самый эффективный способ расчета индексов нового массива?

Аналогично этому вопросу, но не совсем так, поскольку это одномерный массив, а не специфический для Python. Я ищу расчет. Спасибо!

2 ответа

Где твоя проблема? Просто повторите каждую ячейку 1-4 раза, затем повторите строку 1-4 раза...

def resize(data, width, height, factor):
  newdata = []
  for y in range(height):
     row = []
     for x in range(width):
       val = data[y*width + x]
       for r in range(factor):
         row.append( val )
     for r in range(factor):
       newdata.extend( row )
  return newdata

Очевидно, у вас могут быть отдельные факторы для x и y, и вам на самом деле не нужно знать высоту, просто продолжайте, пока не достигнете конца массива. Вы можете минимально оптимизировать, вычисляя y * width только один раз во внешнем цикле, и вы можете добавить некоторый синтаксический сахар для добавления значения "factor" раз:

def resize(data, width, xfactor, yfactor):
  newdata = []
  offset = 0
  while offset + width < len(data):
     row = []
     for x in range(width):
       val = data[offset]
       row.extend( [val] * xfactor )
       offset += 1
     for r in range(yfactor):
       newdata.extend( row )
  return newdata

(сахар синтаксиса умножения массива, вероятно, будет медленнее, чем просто добавление цикла for.)

Скажем X - это размер строки. В приведенном выше примере, X = 4,

Для каждого X Элементы исходного массива вам необходимо:

  1. Дублируйте каждый из них

    A1 A2 A3 A4

    становится

    A1 A1 A2 A2 A3 A3 A4 A4

  2. Дублируйте весь "под-массив", полученный на шаге 1

    A1 A1 A2 A2 A3 A3 A4 A4

    становится

    A1 A1 A2 A2 A3 A3 A4 A4

    A1 A1 A2 A2 A3 A3 A4 A4

Другие вопросы по тегам