如果知道插入点,如何将较小的阵列切成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]
仅使用列表推导?
答案 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
条件
为此,您可以使用iter
和enumerate
给定
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]])