块状整形

问题描述

我正在寻找一种方法来重塑以下1d-numpy数组:

# dimensions
n = 2 # int : 1 ... N
h = 2 # int : 1 ... N
m = n*(2*h+1)

input_data = np.arange(0,(n*(2*h+1))**2)

应将预期输出调整为(2*h+1)**2形状的(n,n)块,例如:

input_data.reshape(((2*h+1)**2,n,n))
>>> array([[[ 0  1]
            [ 2  3]]

           [[ 4  5]
            [ 6  7]]
              ...

           [[92 93]
            [94 95]]

           [[96 97]
            [98 99]]]

这些块最终需要重塑为(m,m)矩阵,以便将它们堆叠在2*h+1块的行中:

>>> array([[ 0,1,4,5,8,9,12,13,16,17],[ 2,3,6,7,10,11,14,15,18,19],...
           [80,81,84,85,88,89,92,93,96,97],[82,83,86,87,90,91,94,95,98,99]])

我的问题是,在第一次重塑为(n,n)块之后,我似乎找不到正确的轴排列。我看了几个答案,例如this one,但徒劳。

由于实际尺寸nh很大,并且此操作是在迭代过程中进行的,因此我正在寻找一种有效的整形操作。

解决方法

我认为您不能单独使用reshapetranspose来做到这一点(尽管我很想证明自己是错的)。使用np.block可以,但是有点混乱:

np.block([list(i) for i in input_data.reshape( (2*h+1),(2*h+1),n,n )])

array([[ 0,1,4,5,8,9,12,13,16,17],[ 2,3,6,7,10,11,14,15,18,19],[20,21,24,25,28,29,32,33,36,37],[22,23,26,27,30,31,34,35,38,39],[40,41,44,45,48,49,52,53,56,57],[42,43,46,47,50,51,54,55,58,59],[60,61,64,65,68,69,72,73,76,77],[62,63,66,67,70,71,74,75,78,79],[80,81,84,85,88,89,92,93,96,97],[82,83,86,87,90,91,94,95,98,99]])

编辑:没关系,您可以不用np.block

input_data.reshape( (2*h+1),n).transpose(0,2,3).reshape(10,10)

array([[ 0,99]])