【问题标题】:How to reshape a multidimensional array from a particular arrangement to another arrangement?如何将多维数组从特定排列重塑为另一种排列?
【发布时间】:2019-07-31 01:03:41
【问题描述】:

我有一个before_arr(2 x 3 x 4) 多维数组。我想把它变成一个new_arr(3 x 2 x 4),我在下面写了一个特定的排列模式。

import numpy as np

before_arr = np.array([
    [
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     ],
    [
     [1, 1, 1, 1],
     [1, 1, 1, 1],
     [1, 1, 1, 1],
     ],
    ], dtype=float)

# what I want
new_arr = np.array([
    [
     [0, 0, 0, 0],
     [1, 1, 1, 1],
     ],
    [
     [0, 0, 0, 0],
     [1, 1, 1, 1],
     ],
    [
     [0, 0, 0, 0],
     [1, 1, 1, 1],
     ],
    ], dtype=float)

before_arr.reshape(3, 2, 4) 没有给我我想要的。

In [74]: before_arr.reshape(3, 2, 4)
Out[74]:
array([[[0., 0., 0., 0.],
        [0., 0., 0., 0.]],

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

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.]]])

【问题讨论】:

  • arr.transpose(1,0,2) 可能会做你想做的事。
  • 哇@hpaulj 你能解释一下它是如何工作的吗?医生说For an n-D array, if axes are given, their order indicates how the axes are permuted ,但不清楚这是什么意思
  • 2,1,0 是一个完整的转置,0,1,2 不会改变任何东西。 1,0,2 切换前 2 个等。

标签: python arrays numpy tensor


【解决方案1】:

使用zip 匹配相应的行。

试试这个:

import numpy as np

before_arr = np.array([
    [
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     ],
    [
     [1, 1, 1, 1],
     [1, 1, 1, 1],
     [1, 1, 1, 1],
     ],
    ], dtype=float)

new_arr = np.array([*zip(*before_arr)])
print(new_arr)

输出:

[[[0. 0. 0. 0.]
  [1. 1. 1. 1.]]

 [[0. 0. 0. 0.]
  [1. 1. 1. 1.]]

 [[0. 0. 0. 0.]
  [1. 1. 1. 1.]]]

【讨论】:

  • 你能解释一下 * 对 np.ndarray 做了什么吗?
  • @Alby 这是一个可迭代的解包。见pep-448。它将数组在其顶层(大小为 2 的暗淡)解压缩为 2 个不同的元素,每个元素的形状为 3x4,然后将它们传递给顶部 zip。
  • * 之前的 zip 和周围的 [ ]实际上可以替换为 list...
【解决方案2】:

由于只需要交换两个轴的位置,可以使用np.swapaxes。这可能是获得所需输出的最直接的方法。

before_arr.swapaxes(0, 1)

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

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

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

在更一般的意义上,您可以使用transpose 为您想要的输出明确定义轴的顺序,如果您需要移动多个轴,这将是有益的(尽管这里没有严格要求)。

before_arr.transpose(1, 0, 2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2012-08-11
    • 1970-01-01
    • 2021-06-10
    • 2016-08-28
    • 2011-05-20
    相关资源
    最近更新 更多