一种使用
list
连接和重复运算符的解决方案:
def concat(x, top, left):
n = len(x[0])
return [[0]*(n + left - len(row)) + row for row in [[]]*top + x]
下面是使用嵌套for
循环解决方案和我的连接解决方案对于一个随机数字10000x10000
矩阵的一些非常基本的计时结果:
nested: 122.26 s
concat: 5.66 s
测试的代码:
import timeit
from random import randint
def concat(x, top, left):
n = len(x[0])
return [[0]*(n + left - len(row)) + row for row in [[]]*top + x]
def nested(x, topPadding, leftPadding):
noOfRows = len(x)+topPadding
noOfCols = len(x)+leftPadding
z = [[0 for i in range(noOfCols)] for j in range(noOfRows)]
for i in range(topPadding,noOfRows):
for j in range(leftPadding,noOfCols):
z[i][j] = x[i-topPadding][j-leftPadding]
return z
test = [[randint(0, 9) for _ in range(10000)] for _ in range(10000)]
t1 = timeit.timeit(
"nested(test, 4, 2)",
number=10,
globals=globals()
)
t2 = timeit.timeit(
"concat(test, 4, 2)",
number=10,
globals=globals()
)
print(nested(test, 4, 2) == concat(test, 4, 2))
print(f"nested: {t1:.2f} s")
print(f"concat: {t2:.2f} s")
完整输出:
True
nested: 122.26 s
concat: 5.66 s
一个修改过的版本,您可以输入所需的高度和宽度:
def concat(x, h, w):
H = h - len(x)
return [[0]*(w - len(row)) + row for row in [[]]*H + x]
另一种版本允许在北、南、东、西方向上进行填充:
def nsew_concat(x, N, S, E, W):
"""Pad x with zeros to the north, south, east, and west."""
k = len(x[0])
stack = [[]]*N + x + [[]]*S
return [([0]*W + [0]*(k - len(row)) + row + [0]*E) for row in stack]