问题描述
我正在寻找一种方法来重塑以下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,但徒劳。
由于实际尺寸n
和h
很大,并且此操作是在迭代过程中进行的,因此我正在寻找一种有效的整形操作。
解决方法
我认为您不能单独使用reshape
和transpose
来做到这一点(尽管我很想证明自己是错的)。使用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]])