2017-10-06 62 views
2

我很難說出我想要的內容,這就是爲什麼我沒有在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))

一般來說,我有C數組a1, ..., aC,形狀(H, W)的,我想將其付諸形狀(h*H, w*W)的陣列,其中h = ceil(sqrt(C))w = ceil(C/h)。 C數組存儲爲一個(C, H, W)維數組。

什麼是最優雅的方式來做到這一點?我通過迭代必要的索引來一起竊取一些東西,但這並不好,所以我停下了腳步。

速度不是最重要的,數組相當小。

+0

如何被存儲陣列的C數?作爲一個多昏暗的數組或數組列表或其他東西? – Divakar

+0

@Divakar添加了一些細節 – fabian789

+0

使用'np.hstack'創建行,直到用完數組,用零填充最後一行,然後用'np.vstack'連接行。 – Michael

回答

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)