【问题标题】:Python: How to reshape a multidimensional array with various dimensions?Python:如何重塑具有各种维度的多维数组?
【发布时间】:2018-11-13 20:30:13
【问题描述】:

假设我有一个这样的数组

[[1,2], [3,4,5]]

我想把它改造成

[[[1],[2]], [[3],[4],[5]]]

在 Python 中有没有一种简单的方法可以做到这一点?我知道如果整个数据的第 2 维相同,这非常容易,但在我的情况下,第 2 维的长度分别为 2 和 3。

非常感谢。

【问题讨论】:

  • numpy 不支持这样的参差不齐的数组。您确定没有列表列表吗?
  • 嗯,这个请求其实是来自图像分类的。
  • 抱歉我昨天没写完。所以当我将RGB颜色的图像读入python时,它只有[[1,2],[3,4,5]]这样的格式,但是要使用keras CNN,最后一个维度必须是一个数组,比如[ [[1],[2]],[[3],[4],[5]]]。如果图像数量相对较少,答案很好,但是当有 100,000 张不同大小的图像时,可能需要一段时间才能完成

标签: python numpy reshape


【解决方案1】:

如果你有这样的清单:

nested = [[1,2], [3,4,5]]

你可以这样拆分:

nested_split = [[[single_elt] for single_elt in inside_list] for inside_list in nested]

调用 print 时会得到以下输出:

[[[1], [2]], [[3], [4], [5]]]

内部或外部列表的维度不会以任何方式影响此解决方案,因为使用 for 循环和列表推导将动态适应任何大小的列表。

【讨论】:

    【解决方案2】:

    我们可以质疑这是一个列表列表还是多维数组,但concateante 很好地将其展平为一维数组:

    In [173]: alist = [[1,2], [3,4,5]]
    In [175]: np.concatenate(alist, axis=0)
    Out[175]: array([1, 2, 3, 4, 5])
    

    那么就很容易将其reshape成(5,1)形状数组了:

    In [176]: np.concatenate(alist, axis=0).reshape(-1,1)
    Out[176]: 
    array([[1],
           [2],
           [3],
           [4],
           [5]])
    

    有一些用于展平列表列表的习语,但由于您将其标记为 numpy,因此 numpy 方法更加明显。

    In [177]: import itertools
    In [178]: list(itertools.chain(*alist))
    Out[178]: [1, 2, 3, 4, 5]
    In [180]: [[x] for x in itertools.chain(*alist)]
    Out[180]: [[1], [2], [3], [4], [5]]
    

    【讨论】:

      【解决方案3】:

      你可以使用x for x in array机制:

      >>> a = [[1,2], [3,4,5]]
      >>> [[[a2] for a2 in a1] for a1 in a]
      [[[1], [2]], [[3], [4], [5]]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2012-09-28
        • 2018-04-12
        • 2017-05-06
        • 1970-01-01
        • 2017-06-08
        • 2013-03-18
        相关资源
        最近更新 更多