【问题标题】:Reshape 3D numpy array with heterogeneous dimensions to 2D numpy array将具有异构维度的 3D numpy 数组重塑为 2D numpy 数组
【发布时间】:2017-12-18 18:22:51
【问题描述】:

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

例子:

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 并迭代第一维来执行此操作。但如果可能的话,我想以 Python 的方式进行这种重塑,而无需明确地迭代我的数据。

我已经尝试执行列表综合来获取每个块的第一个形状,然后对这些值求和并将其与 reshape 一起使用。像这样:

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

有什么想法吗?

额外:如果可能的话,在上述条件下进行反向转换真的很棒!

【问题讨论】:

  • np.concatenate(inp axis=0) 怎么样?
  • 什么,确切地您正在使用什么?您的示例input 数组不是数组,它是list 对象。给我们一个实际数组的例子。请注意,您说您的数组是“3D”,但是如果我在您的 input 数据上使用数组构造函数,它会返回一个一维数组...
  • 嗯,我认为您别无选择,只能使用np.vstack。或np.concatenate 在数组列表中。

标签: python arrays numpy reshape


【解决方案1】:

按照 cmets 中的建议,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

试图从列表中创建一个数组只会创建一个列表的一维数组。帮助不大。 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 是一样的,只是它确保子数组都是二维的,在这种情况下它们已经是二维的。

【讨论】:

  • 这解决了我的问题。谢谢!但是有可能做相反的过程吗?因为我正在用 sklearn 的预处理模块“标准化”数据,所以我需要写回数据......
  • np.split(和变体)可以将数组拆分为数组列表。或者只是使用您自己的列表理解。
猜你喜欢
  • 2017-09-18
  • 2016-05-22
  • 2019-06-26
  • 2015-10-19
  • 2019-09-12
  • 2020-08-17
  • 2019-07-10
  • 2016-06-01
  • 2020-04-22
相关资源
最近更新 更多