【问题标题】:Python: Reshaping array of arrays [closed]Python:重塑数组数组[关闭]
【发布时间】:2021-01-31 20:22:02
【问题描述】:

是否可以像这样重塑数组数组:

np.array([[1,1,1,1,1,1],
          [1,0,0,0,0,1],
          [1,0,1,1,0,1]])

分成多个 3x2 数组,像这样:

np.array([
    [[1,1],[1,0],[1,0]],
    [[1,1],[0,0],[1,1]],
    [[1,1],[0,1],[0,1]]])

提前致谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow!请拨打tour,阅读what's on-topic hereHow to Ask,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。您必须做出诚实的尝试,然后针对您的算法或技术提出具体问题。
  • 假设顶部是a,你可以通过a.reshape((3,3,2))把它变成底部形式。
  • 我认为不可能直接重塑,因为两种形状的扁平形式不同。
  • 你需要做一个transpose 以及reshape

标签: python arrays numpy reshape


【解决方案1】:

要获得您正在寻找的特定输出,您需要重塑和转置特定列(通过传入要转置的列)。

首先,您需要重塑以获得所需的分组。使用-1 就像一个通配符,它​​将使中间值成为正确填充形状所需的任何值。

arr.reshape(3,-1, 2) 重塑给你:

array([[[1, 1],[1, 1],[1, 1]],
       [[1, 0],[0, 0],[0, 1]],
       [[1, 0],[1, 1],[0, 1]]])

组是正确的,但希望将列分组为行。这就是transpose 的用途。在这种情况下,您需要交换第一和第二轴。

您可以像这样一步完成:

import numpy as np

arr = np.array([
    [1,1,1,1,1,1],
    [1,0,0,0,0,1],
    [1,0,1,1,0,1]])

arr.reshape(3,-1, 2).transpose([1, 0, 2])

输出:

array([[[1, 1], [1, 0], [1, 0]],
       [[1, 1], [0, 0], [1, 1]],
       [[1, 1], [0, 1], [0, 1]]])

【讨论】:

  • 这就是我要找的!太感谢了!你能简单解释一下重塑的过程吗?
  • @JúlioFortunato,见编辑。希望这将为您指明正确的方向。
  • 如果原始列表是 30x30 的列表,transposereshape 的值是否相同?
【解决方案2】:

numpy 具有reshape() 的能力。

In [29]: a=np.array([[1,1,1,1,1,1],
    ...:           [1,0,0,0,0,1],
    ...:           [1,0,1,1,0,1]])

In [30]: a.reshape((3,3,2))
Out[30]:
array([[[1, 1],
        [1, 1],
        [1, 1]],

       [[1, 0],
        [0, 0],
        [0, 1]],

       [[1, 0],
        [1, 1],
        [0, 1]]])

不过,这只是改变了视图。如果需要,可以重新分配a = a.reshape((3,3,2))

【讨论】:

  • 快到了!我有点想要这个结果的转置数组,但如果我使用 a.reshape((3,3,2)).T 它会变成一个 3x3 数组的数组。如何使这个转置为三个 3x2 数组?
【解决方案3】:

回答是否可以将一个数组重塑为另一个数组的最佳方法是比较它们的扁平形式:

arr = np.array([[1,1,1,1,1,1], [1,0,0,0,0,1], [1,0,1,1,0,1]])
arr2 = np.array([[[1,1],[1,0],[1,0]], [[1,1],[0,0],[1,1]], [[1,1],[0,1],[0,1]]])
>>> print(arr.flatten())
[1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1]
>>> print(arr2.flatten())
[1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1]

在这种情况下这是不可能的,因为结果不同。您需要额外swapaxes

arr.reshape(3,3,2).swapaxes(0,1)

【讨论】:

    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2021-06-05
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多