Мне нужно взять массив с данными, которые могут отображаться в двух измерениях, и вставить его поверх любой части двумерного массива, как если бы это было изображение. Эта функция будет похожа на функция вставки библиотеки Python Pillow.
Скажем, у меня есть двумерный массив размером 5x5 со значением по умолчанию 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]
]
И у меня есть средний массив длиной 4, который можно собрать в виде 2x2.
[0, 1,
1, 1]
При этом мне нужна функция, чтобы, как если бы эти массивы были изображениями, «вставить» второй поверх первого. С позицией (привязанной сверху слева) (1,2) это приведет к этому 2D-массиву.
[
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 1, 0, 0],
[0, 0, 0, 0, 0]
]
Вот моя попытка создать код Python.
class Indexed:
def __init__(self, x, y):
self.array = [[0]*x]*y
self.dimensions = (x, y)
def writeImage(self, indexed, x, y, width, height):
index = 0
for ArrayY in range(height):
self.array[ArrayY] = [0]*self.dimensions[0]
for ArrayX in range(width):
self.array[1 + ArrayY][x + ArrayX] = indexed[index]
index+=1
Test = Indexed(12,12)
Test.writeImage(
[
0,0,7,0,0,7,0,0,
0,0,7,0,0,7,0,0,
0,0,7,0,0,7,0,0,
7,0,0,0,0,0,0,7,
7,7,7,7,7,7,7,7
],
0,0, 8,5
)
print(Test.array)
Если вы попытаетесь запустить приведенный выше код, вы увидите, что он выводит этот результат.
[
[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, 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],
[7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0],
[7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0],
[7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0],
[7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0],
[7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0],
[7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0],
[7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0]
]
Это предполагаемый результат.
[
[0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0],
[0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0],
[0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0],
[7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0],
[7, 7, 7, 7, 7, 7, 7, 7, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
]
Я много возился с этим и не нашел в Интернете ответов на вопрос, почему эти массивы работают так, как здесь.
Любая помощь приветствуется.
Последние два аргумента @CristiFati writeImage предназначены для указания ширины и высоты массива, который вы передаете. Вход множество, который я передаю с шириной и высотой, также может быть 2D-массивом, однако с тем, как я получаю данные, я полагаю было бы слишком хлопотно вставлять в 2D-массив с помощью 2D-массива. Лучший способ, которым я могу описать этот процесс, — это как вставка одного меньшего изображения (входной массив) поверх большего (индексированного.массива).
Под множество я имел в виду список, кортеж и массив NumPy? Потому что у некоторых эта функция уже встроена. Теперь я вижу, что входной массив - это 1D. stackoverflow.com/questions/12791501/….
Когда вы инициализируете self.array [[0]*x]*y
. [0]*x копируется только поверхностно (только для справки) y раз, что означает, что вся строка в основном представляет собой один и тот же массив.
Поскольку это тот же массив, его окончательным значением будет последняя строка, т. е. 7,7,7,7,7,7,7,7
. Вот почему обновленный имеет такое значение.
Также отмечено, что индекс неверен в writeImage
from pprint import pprint
class Indexed:
def __init__(self, x, y):
self.array = [0]*y
for i in range(y):
self.array[i] = [0]*x
self.dimensions = (x, y)
def writeImage(self, indexed, x, y, width, height):
for ArrayY in range(height):
for ArrayX in range(width):
index = (ArrayY * width) + ArrayX
self.array[y + ArrayY][x + ArrayX] = indexed[index]
Test = Indexed(12,12)
Test.writeImage(
[
0,0,7,0,0,7,0,0,
0,0,7,0,0,7,0,0,
0,0,7,0,0,7,0,0,
7,0,0,0,0,0,0,7,
7,7,7,7,7,7,7,7
],
0,0, 8,5
)
pprint(Test.array)
Что вы подразумеваете под множество? В NumPy это можно сделать с помощью одного оператора (назначение + нарезка). Также последние 2 аргумента writeImage могут (должен) быть выведены из проиндексирован.