Как мне вставить массив в двумерный массив?

Цель

Мне нужно взять массив с данными, которые могут отображаться в двух измерениях, и вставить его поверх любой части двумерного массива, как если бы это было изображение. Эта функция будет похожа на функция вставки библиотеки 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]
]

Я много возился с этим и не нашел в Интернете ответов на вопрос, почему эти массивы работают так, как здесь.

Любая помощь приветствуется.

Что вы подразумеваете под множество? В NumPy это можно сделать с помощью одного оператора (назначение + нарезка). Также последние 2 аргумента writeImage могут (должен) быть выведены из проиндексирован.

CristiFati 23.04.2022 11:34

Последние два аргумента @CristiFati writeImage предназначены для указания ширины и высоты массива, который вы передаете. Вход множество, который я передаю с шириной и высотой, также может быть 2D-массивом, однако с тем, как я получаю данные, я полагаю было бы слишком хлопотно вставлять в 2D-массив с помощью 2D-массива. Лучший способ, которым я могу описать этот процесс, — это как вставка одного меньшего изображения (входной массив) поверх большего (индексированного.массива).

Bobbo-Cat 23.04.2022 11:51

Под множество я имел в виду список, кортеж и массив NumPy? Потому что у некоторых эта функция уже встроена. Теперь я вижу, что входной массив - это 1D. stackoverflow.com/questions/12791501/….

CristiFati 23.04.2022 14:50
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
3
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы инициализируете 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)

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