重新塑造具有异质维度的3D numpy阵列到二维numpy阵列

我的数据是三维的,但只有第三轴有一个已知维度,我需要将其转换为二维数组。

例:

input = 
[[[1, 2, 3]],

 [[4, 5, 6],
  [7, 8, 9]],

 [[1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]]]

input_reshaped = 
[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9],
 [1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

所以我有一个3D数据,其中第一维和第二维在我的数据集中是可变的,而第三维是恒定的并且先前已知。

输入中的每个块也是numpy数组。 我知道我可以使用numpy.vstack执行此操作并遍历第一维。 但是如果可能的话,我希望通过Pythonic的方式进行重塑,而不用重复遍历我的数据。

我已经尝试执行列表强制来获得每个块的第一个形状,然后总结这些值并将其用于重塑。 喜欢这个:

def myStack(a):
    lengths = [item.shape[0] for item in a]
    common_dim = a[0].shape[1]
    return a.reshape(np.sum(lengths), common_dim)

但是在上例中的输入中,出现以下错误:

ValueError: cannot reshape array of size 3 into shape (6,3)

因为看到输入的Python有一个形状为(3,)的numy.array

有任何想法吗?

额外:如果可能的话,在上述条件下进行逆向变换将非常棒!


按照评论中的建议, vstackconcatenate

In [320]: alist
Out[320]: [[[1, 2, 3]], [[4, 5, 6], [7, 8, 9]], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]]
In [321]: len(alist)
Out[321]: 3

试图从列表中创建一个数组只是创建一个1d的列表数组。 帮助不大。 reshape将无法正常工作。

In [322]: np.array(alist)
Out[322]: 
array([list([[1, 2, 3]]), list([[4, 5, 6], [7, 8, 9]]),
       list([[1, 2, 3], [4, 5, 6], [7, 8, 9]])], dtype=object)

但是concatenate与数组(或类似数组的对象)列表一起工作:

In [323]: np.concatenate(alist, axis=0)
Out[323]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9],
       [1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

concatenate也可以与Out[322]一起工作,因为它将输入视为一个列表,即使它是一个数组。

vstack是相同的东西,除非它确保子vstack都是2d,在这种情况下它们已经是2d了。

链接地址: http://www.djcxy.com/p/68111.html

上一篇: Reshape 3D numpy array with heterogeneous dimensions to 2D numpy array

下一篇: Slice 2d array into smaller 2d arrays