如何重塑3d numpy表?



我有一个形状=(2,3,4)的3d numpy表,如下所示:

a = np.array([[[1., 2., 3., 4.],
[1., 2., 3., 4.],
[1., 2., 3., 4.]],
[[5., 6., 7., 8.],
[5., 6., 7., 8.],
[5., 6., 7., 8.]]])

并且想要以一种方式重塑它,即每个维度的列被堆叠成二维矩阵中的新列。

1  5
1  5
1  5
2  6
2  6
2  6
3  7
3  7
3  7
4  8
4  8
4  8

给你:

res = a.T.reshape((-1,2))

输出:

array([[1., 5.],
[1., 5.],
[1., 5.],
[2., 6.],
[2., 6.],
[2., 6.],
[3., 7.],
[3., 7.],
[3., 7.],
[4., 8.],
[4., 8.],
[4., 8.]])

要重塑numpy数组,请使用reshape方法。

基本上,它会在数组被平面化时查看它,并使用新的给定形状对其进行处理。然而,它首先迭代最后一个索引,即,将处理最内部的列表,然后是下一个,依此类推。

因此,np.array([1, 2, 3, 4, 5, 6]).reshape((3, 2))np.array([[1, 2, 3], [4, 5, 6]]).reshape((3, 2))都将得到[[1, 2], [3, 4], [5, 6]],因为这两个原始数组在扁平化时是相同的。

你想要一个(12,2)数组,或者如果你读reshape文档,你可以传递(- 1,2),numpy将计算另一个维度。

所以如果你只是给你的数组的新形状,它将开始与第一个列表x[0, 0] = [1, 2, 3, 4],这将成为[[1, 2], [3, 4]],…那不是你想要的。

但是请注意,如果您先对数组进行转置,那么您将在内部列表中拥有您想要的项(快速变化索引):

In : x.T
Out: 
array([[[1., 5.],
[1., 5.],
[1., 5.]],
[[2., 6.],
[2., 6.],
[2., 6.]],
[[3., 7.],
[3., 7.],
[3., 7.]],
[[4., 8.],
[4., 8.],
[4., 8.]]])

这几乎是你想要的,除了额外的维度。现在你可以重塑它得到你想要的(12,2)数组

In : x.T.reshape((-1, 2))
Out: 
array([[1., 5.],
[1., 5.],
[1., 5.],
[2., 6.],
[2., 6.],
[2., 6.],
[3., 7.],
[3., 7.],
[3., 7.],
[4., 8.],
[4., 8.],
[4., 8.]])

最新更新