Как масштабировать сетку, хранящуюся в виде одномерного массива?
У меня есть сетка 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
Элементы исходного массива вам необходимо:
Дублируйте каждый из них
A1 A2 A3 A4
становится
A1 A1 A2 A2 A3 A3 A4 A4
Дублируйте весь "под-массив", полученный на шаге 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