我将如何将数组粘贴到二维数组上?

How would I go about pasting an array over a 2D array?

Objective

我需要获取一个包含可以二维显示的数据的数组,并将其粘贴到二维数组的任何部分,就好像它是图像一样。此函数类似于 Python 库 Pillow 的 paste function.

例子

假设我有一个二维数组,大小为 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]

有了这个,我需要一个函数,就像这些数组是图像一样,'paste' 第二个在第一个之上。对于 (1,2) 的位置(从左上角锚定),它会产生这个二维数组。

[
 [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]
]

我对它进行了很多修改,但没有在网上找到任何关于为什么这些数组以它们在这里的方式工作的答案。

非常感谢任何帮助。

初始化时 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)