将大小相等的数组合并为平铺大数组

时间:2017-10-06 07:35:05

标签: python numpy

我很难说出我想要的东西,这就是为什么我没有在Google上找到它。在制定一般情况之前,让我先举一个例子。

假设我们有7个数组a1, ..., a7,每个数组(4, 5)。我想要一个新的数组,其中7个数组的排列方式如下:

a1 a2 a3
a4 a5 a6
a7 0  0

此数组的形状为(3*4, 3*5) == (12, 15),0为np.zeros((4, 5))

一般来说,我有形状为a1, ..., aC的C数组(H, W),我希望将它们放入形状为(h*H, w*W)的数组中,其中h = ceil(sqrt(C))和{{ 1}}。 C数组存储为一个w = ceil(C/h)维数组。

最优雅的方法是什么?我通过迭代必要的索引来一起攻击某些东西,但这并不好,所以我停了下来。

速度不是最重要的,数组相当小。

1 个答案:

答案 0 :(得分:2)

方法#1

轴的一些排列和重塑应该可以胜任 -

C,m,n = a.shape
h = int(np.ceil(np.sqrt(C)))
w = int(np.ceil(C/h))

out = np.zeros((h,w,m,n),dtype=a.dtype)
out.reshape(-1,m,n)[:C] = a
out = out.swapaxes(1,2).reshape(-1,w*n)

示例输入,输出 -

In [340]: a
Out[340]: 
array([[[55, 58],
        [75, 78]],

       [[78, 20],
        [94, 32]],

       [[47, 98],
        [81, 23]],

       [[69, 76],
        [50, 98]],

       [[57, 92],
        [48, 36]],

       [[88, 83],
        [20, 31]],

       [[91, 80],
        [90, 58]]])

In [341]: out
Out[341]: 
array([[55, 58, 78, 20, 47, 98],
       [75, 78, 94, 32, 81, 23],
       [69, 76, 57, 92, 88, 83],
       [50, 98, 48, 36, 20, 31],
       [91, 80,  0,  0,  0,  0],
       [90, 58,  0,  0,  0,  0]])

方法#2

更简单的zeros-concatenation -

z = np.zeros((h*w-C,m,n),dtype=a.dtype)
out = np.concatenate((a,z)).reshape(h,w,m,n).swapaxes(1,2).reshape(-1,w*n)

使用zeros-paddingnp.pad -

进行修改/简化
zp = np.pad(a,((0,h*w-C),(0,0),(0,0)),'constant')
out = zp.reshape(h,w,m,n).swapaxes(1,2).reshape(-1,w*n)