仅使用python列表将2D数组的一部分替换为另一个2D数组?

时间:2018-07-27 02:29:33

标签: python arrays

如果知道插入点,如何将较小的阵列切成N x M的阵列?

# Larger array
[1,1,1,1,1,1,1,1,1,1]
[1,1,1,1,1,1,1,1,1,1]
[1,1,1,1,1,1,1,1,1,1]

# Smaller array
[1,2,3,4]
[5,6,7,8]

# Insert at [1,6] gives:
[1,1,1,1,1,1,1,1,1,1]
[1,1,1,1,1,1,1,2,3,4]
[1,1,1,1,1,1,5,6,7,8]

仅使用列表推导?

3 个答案:

答案 0 :(得分:1)

l = [[1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1]]
s = [[1,2,3,4],
[5,6,7,8]]
def insert(large, small, row, col):
    for i, r in enumerate(small):
        large[row + i][col:col + len(r)] = r
insert(l, s, 1, 6)
print(l)

这将输出:

[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 2, 3, 4], [1, 1, 1, 1, 1, 1, 5, 6, 7, 8]]

答案 1 :(得分:0)

Edit

我刚刚意识到您现在处于 using just list comprehensions 条件

为此,您可以使用iterenumerate

给定

a1 = [[1,1,1,1,1,1,1,1,1,1],
     [1,1,1,1,1,1,1,1,1,1],
     [1,1,1,1,1,1,1,1,1,1],
     [1,1,1,1,1,1,1,1,1,1]]

a2=[[1,2,3,4],
    [5,6,7,8]]

x,y = (1,6)

你可以

cols = len(a2[0])
ran = range(x,x+len(a2))
it = iter(a2)

final = [r if i not in ran else r[:y] + next(it) + r[(y+ncols):] for i,r in enumerate(a1)]

用例:

x,y = (2,6)

输出

[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 2, 3, 4],
 [1, 1, 1, 1, 1, 1, 5, 6, 7, 8]]

x,y = (1,4)
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 2, 3, 4, 1, 1],
 [1, 1, 1, 1, 5, 6, 7, 8, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]


x,y = (0,0)

[[1, 2, 3, 4, 1, 1, 1, 1, 1, 1],
 [5, 6, 7, 8, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

另一种解决方案是使用numpy

如果有

import numpy as np

x = np.array([[1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1]])

a = np.array([[1,2,3,4],
[5,6,7,8]])

您可以使用numpy indexing

x[1:,6:] = a

获得

array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 2, 3, 4],
       [1, 1, 1, 1, 1, 1, 5, 6, 7, 8]])

答案 2 :(得分:0)

如果您乐于使用第三方库,NumPy可为任意坐标提供通用解决方案:

i, j = (1, 6)

x[i:i+a.shape[0], j:j+a.shape[1]] = a

print(x)

array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 2, 3, 4],
       [1, 1, 1, 1, 1, 1, 5, 6, 7, 8]])