np.pad 太过分了,在 2d 图像周围添加边框比在列表中添加一些零更好。
我喜欢zip_longest,特别是如果输入是列表,并且不需要是数组。它可能是最接近在编译代码中一次对所有列表进行操作的代码的代码)。
a, b = zip(*list(itertools.izip_longest(a, b, fillvalue=0)))
是一个完全不使用np.array的版本(节省了一些数组开销)
但它本身不会截断。它仍然像[x[:5] for x in (a,b)]。
这是我对all_ms 函数的变体,使用简单的列表或一维数组:
def foo_1d(x, n=5):
x = np.asarray(x)
assert x.ndim==1
s = np.min([x.shape[0], n])
ret = np.zeros((n,), dtype=x.dtype)
ret[:s] = x[:s]
return ret
In [772]: [foo_1d(x) for x in [[1,2,3], [1,2,3,4,5], np.arange(10)[::-1]]]
Out[772]: [array([1, 2, 3, 0, 0]), array([1, 2, 3, 4, 5]), array([9, 8, 7, 6, 5])]
numpy 解决方案的一种或其他方式做同样的事情 - 构造一个所需形状的空白数组,然后用原始的相关值填充它。
另一个细节 - 理论上,截断解决方案时可以返回视图而不是副本。但这需要与垫盒分开处理。
如果所需的输出是等长数组的列表,则可能值得将它们收集到二维数组中。
In [792]: def foo1(x, out):
x = np.asarray(x)
s = np.min((x.shape[0], out.shape[0]))
out[:s] = x[:s]
In [794]: lists = [[1,2,3], [1,2,3,4,5], np.arange(10)[::-1], []]
In [795]: ret=np.zeros((len(lists),5),int)
In [796]: for i,xx in enumerate(lists):
foo1(xx, ret[i,:])
In [797]: ret
Out[797]:
array([[1, 2, 3, 0, 0],
[1, 2, 3, 4, 5],
[9, 8, 7, 6, 5],
[0, 0, 0, 0, 0]])