我有一个操作numpy数组的问题。给定一个三维数组np.array([[[1,2],[3,4]], [[5,6],[7,8]]])
,它是一个(2,2,2)
的数组。我想将它操作成一个(2,4)
的数组,使得a = np.array([[1,2,5,6],[3,4,7,8]])
。我想知道是否有任何numpy内置方法特别处理这类问题,并且可以轻松推广。
编辑:感谢大家的回答。它们都很好!我认为我应该澄清一下原来帖子中的“易于推广”的含义。假设现在有一个(6,3,2,3)
的数组(这是我实际面临的挑战)。
a = array([[[[ 10, 20, 30],
[ 40, 40, 20]],
[[ 22, 44, 66],
[ 88, 88, 44]],
[[ 33, 66, 99],
[132, 132, 66]]],
[[[ 22, 44, 66],
[ 88, 88, 44]],
[[ 54, 108, 162],
[216, 216, 108]],
[[ 23, 46, 69],
[ 92, 92, 46]]],
[[[ 14, 28, 42],
[ 56, 56, 28]],
[[ 25, 50, 75],
[100, 100, 50]],
[[ 33, 66, 99],
[132, 132, 66]]],
[[[ 20, 40, 60],
[ 80, 80, 40]],
[[ 44, 88, 132],
[176, 176, 88]],
[[ 66, 132, 198],
[264, 264, 132]]],
[[[ 44, 88, 132],
[176, 176, 88]],
[[108, 216, 324],
[432, 432, 216]],
[[ 46, 92, 138],
[184, 184, 92]]],
[[[ 28, 56, 84],
[112, 112, 56]],
[[ 50, 100, 150],
[200, 200, 100]],
[[ 66, 132, 198],
[264, 264, 132]]]])
我希望将其转换为一个(3,3,2,2,3)
的数组,并对a[0,:,:,:,:]
进行操作。
a[0,0,0,:,:] = np.array([[10,20,30],[40,40,20]]);
a[0,1,0,:,:] = np.array([[22,44,66],[88,88,44]]);
a[0,2,0,:,:] = np.array([[33,66,99],[132,132,66]]);
a[0,0,1,:,:] = np.array([[20,40,60],[80,80,40]]);
a[0,1,1,:,:] = np.array([[44,88,132],[176,176,88]]);
a[0,2,1,:,:] = np.array([[66,132,198],[264,264,132]]).
简言之,最后3个最大块应该与前3个最大块合并,形成3个(3,2)的块。其余2个块即 (
a[1,:,:,:,:]
, a[2,:,:,:,:]
) 遵循相同的模式。
zip
的解决方案,但我更喜欢 Albin Paul 使用swapaxes
的答案。 - joanisa
。形状为 (2,2,2),有三种不同的方法可以组合值来创建一个 (2,4) 的数组。reshape
连接最后两个维度。reshape(4,2)
连接前两个。你想要连接第一个和最后一个,这需要重新排序元素。重新阅读reshape
文档,并注意 "您可以将重塑视为首先展平数组..." 这一行。 - hpaulj