我很难说出我想要的东西,这就是为什么我没有在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)
维数组。
最优雅的方法是什么?我通过迭代必要的索引来一起攻击某些东西,但这并不好,所以我停了下来。
速度不是最重要的,数组相当小。
答案 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-padding
与np.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)