我有一个大小为(2,2,4,2,2)的5D二进制数组'a'。结构看起来像这样,例如:
a[0,0]:
[[[ 0. 1.]
[ 0. 0.]]
[[ 0. 0.]
[ 0. 1.]]
[[ 0. 0.]
[ 0. 1.]]
[[ 0. 0.]
[ 1. 0.]]]
我想做的是制作一个(2,2,4,4)矩阵,它在最后两个轴中组合2x2矩阵,但是采用方形结构。
结果应如下所示:
result[0,0]:
[[0. 1. 0. 0.]
[0. 0. 0. 1.]
[0. 0. 0. 0.]
[0. 1. 1. 0.]]
我希望这很清楚。如果我将原始矩阵的括号放在结果中,它看起来像这样:
result[0,0]:
[[[0. 1. [0. 0.]
[0. 0.] 0. 1.]]
[[0. 0. [0. 0.]
[0. 1.] 1. 0.]]]
答案 0 :(得分:3)
您似乎正在将第3轴从(4)分解为(2,2)并将分割轴的前半部分引入第二个最后轴位置。因此,有两种方法可以使用np.reshape
和np.transpose
来实现此类输出,就像这样 -
out = a.reshape(2,2,2,2,2,2).transpose(0,1,3,4,2,5).reshape(2,2,4,4)
out = a.reshape(2,2,2,-1,2).transpose(0,1,3,2,4).reshape(2,2,4,4)
示例运行 -
In [69]: a[0][0]
Out[69]:
array([[[49, 91],
[10, 32]],
[[71, 27],
[50, 64]],
[[ 9, 41],
[73, 52]],
[[54, 85],
[53, 36]]])
In [70]: out1 = a.reshape(2,2,2,2,2,2).transpose(0,1,3,4,2,5).reshape(2,2,4,4)
In [71]: out2 = a.reshape(2,2,2,-1,2).transpose(0,1,3,2,4).reshape(2,2,4,4)
In [72]: out1[0][0]
Out[72]:
array([[49, 91, 9, 41],
[10, 32, 73, 52],
[71, 27, 54, 85],
[50, 64, 53, 36]])
In [73]: out2[0][0]
Out[73]:
array([[49, 91, 9, 41],
[10, 32, 73, 52],
[71, 27, 54, 85],
[50, 64, 53, 36]])
答案 1 :(得分:2)
首先,最好将您的数组编入索引,例如a[0,0]
或a[0,0,...]
或a[0,0,:,:]
。
a.reshape(2,2, 4,4)
能做你想做的吗?这保留了所有值,但将最内层的(2,2)
数组重新整形为(4,)
数组。
仔细观察看起来您想要对内部数组中的值重新排序。根据您的描述,这并不完全明显。我必须仔细匹配显示之间的值。特别是它只有2个不明确的子阵列:
[[ 0. 0.]
[ 0. 1.]]
[[ 0. 0.]
[ 1. 0.]]]
[0. 0. 0. 0.]
[0. 1. 1. 0.]]
我们需要做的是在重塑之前调换最后2个轴。
这可能会起到作用:
a.transpose(0,1,2,4,3).reshape(2,2,4,4)
它可以与np.ones((2,2,4,2,2))
一起使用,但我还没有使用与您的问题重复的数字对其进行测试 - 因为您没有提供可以剪切粘贴的测试用例。
oops - 看起来像Divakar
做对了。我们需要将4
维度分解为2,2
,并跨维度执行转置。
In [290]: a=np.array([[[0,1],[0,0]],[[0,0],[0,1]],[[0,0],[0,1]],[[0,0],[1,0]]])
In [291]: a
Out[291]:
array([[[0, 1],
[0, 0]],
[[0, 0],
[0, 1]],
[[0, 0],
[0, 1]],
[[0, 0],
[1, 0]]])
In [292]: a.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
Out[292]:
array([[0, 1, 0, 0],
[0, 0, 0, 1],
[0, 0, 0, 0],
[0, 1, 1, 0]])
这里有一个更清晰的例子:
In [303]: a=np.arange((4*2*2)).reshape(4,2,2)
In [304]: a.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
Out[304]:
array([[ 0, 1, 4, 5],
[ 2, 3, 6, 7],
[ 8, 9, 12, 13],
[10, 11, 14, 15]])
如果每个维度都不同,那就更好了,因此对哪些维度的组合更加模糊。
In [308]: a=np.arange((6*5*7)).reshape(6,5,7)
In [309]: a.reshape(2,3,5,7).transpose(0,2,1,3).reshape(10,21)