我想要这个
# assume each 2x2 as assigned number on right
[[[False True] # 1
[False False]]
[[False False] # 2
[False True]]
[[ True False] # 3
[False False]]
[[False True] # 4
[False False]]]
重塑为
[[[[False True False False]
[False False False True]
[ True False False True]
[False False False False]]]]
,如
[[[[False True | False False] # 1 | 2
[False False | False True] ___ ___
---------- -----------
[ True False | False True] # 3 | 4
[False False | False False]]]]
但是在使用arr.reshape(1,1,4,4)
[[[[False True False False] # 1 flat
[False False False True] # 2 flat
[ True False False False] # 3 flat
[False True False False]]]] # 4 flat
请注意,每个2x2都是扁平的。我希望numpy重塑,使得2x2保持不变,同时调整之前的尺寸。我该怎么做?
编辑: arr
的形状为m,n,r
,m
可能为奇数
EDIT2:
案例9x2x2到1x1x6x6
我有什么:
[[[False False]
[False True]]
[[False False]
[False True]]
[[ True False]
[False False]]
[[False False]
[False True]]
[[False False]
[ True False]]
[[False False]
[ True False]]
[[False True]
[False False]]
[[False False]
[ True False]]
[[ True False]
[False False]]]
预期:
[[[[False False | False False | True False]
[False True | False True | False False]
----------- ----------- ----------
[False False | False False | False False]
[False True | True False | True False]
---------- ----------- -----------
[False True | False False | True False]
[False False | True False | False False]]]]
我得到了什么:
[[[[False False False True False False] # 1 flattened; half of 2
[False True True False False False] # rem half of 2; flattened 3
[False False False True False True] # ...
[False False False True False False]
[False False True False False True]
[False False True False False False]]]]
答案 0 :(得分:2)
难题的重要部分是第一个轴是一个正方形数字,我们将它按正方根数分割,给我们一个4D
数组。如果第一个轴不是平方数,我们需要另一个输入参数来告诉我们沿最终输出中的列或行保留的块数。拆分后,交换轴1
和2
,最后重塑 -
m = int(np.rint(np.sqrt(a.shape[0])))
out = a.reshape(m,m,2,2).swapaxes(1,2).reshape(m*2,-1)
示例运行 -
1]输入:
In [69]: a
Out[69]:
array([[[False, False],
[False, True]],
[[False, False],
[False, True]],
[[ True, False],
[False, False]],
[[False, False],
[False, True]],
[[False, False],
[ True, False]],
[[False, False],
[ True, False]],
[[False, True],
[False, False]],
[[False, False],
[ True, False]],
[[ True, False],
[False, False]]], dtype=bool)
2]输出:
In [70]: m = int(np.sqrt(a.shape[0]))
In [71]: a.reshape(m,m,2,2).swapaxes(1,2).reshape(m*2,-1)
Out[71]:
array([[False, False, False, False, True, False],
[False, True, False, True, False, False],
[False, False, False, False, False, False],
[False, True, True, False, True, False],
[False, True, False, False, True, False],
[False, False, True, False, False, False]], dtype=bool)
答案 1 :(得分:0)
在这种情况下使用einops
。
In: x
array([[[False, False],
[False, True]],
[[False, False],
[False, True]],
[[ True, False],
[False, False]],
[[False, False],
[False, True]],
[[False, False],
[ True, False]],
[[False, False],
[ True, False]],
[[False, True],
[False, False]],
[[False, False],
[ True, False]],
[[ True, False],
[False, False]]])
In: einops.rearrange(x, '(h w) h2 w2 -> (h h2) (w w2)', h=3)
array([[False, False, False, False, True, False],
[False, True, False, True, False, False],
[False, False, False, False, False, False],
[False, True, True, False, True, False],
[False, True, False, False, True, False],
[False, False, True, False, False, False]])
请参阅einops
文档,基本上它允许以显式方式编写各种重排。