微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

块状整形

如何解决块状整形

我正在寻找一种方法来重塑以下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]])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。