【问题标题】:Invert structure of array反转数组结构
【发布时间】:2021-08-28 05:15:22
【问题描述】:

我有一个代表视频的数组。目前它的设置方式是第一个元素是第一个像素在所有不同时间步长的所有值的数组,然后第二个元素是第二个像素的值,依此类推。我想要它,所以第一个元素将是第一个时间步的所有像素的数组。

所以对于 2x2 视频的两帧,我想要

[
  [
    [a1, a2, a3], [b1, b2, b3]
  ],
  [
    [c1, c2, c3], [d1, d2, d3]
  ]
]

成为

[
 [
  [a1, b1],
  [c1, d1]
 ],
 [
  [a2, b2],
  [c2, d2]
 ],
 [
  [a3, b3],
  [c3, d3]
 ],
]

我目前的实现是这样的:

def remap_image(seq):
    # seq = np.array(seq)
    s = seq.shape
    a = np.zeros((s[2], s[0], s[1]))

    for x, px in enumerate(tqdm(seq)):
        for y, py in enumerate(px):
            for p_counter, value in enumerate(py):
                a[p_counter][x][y] = value/100.
    return a

这按预期工作,但是这种方法非常慢。有没有更快的方法来做到这一点?

【问题讨论】:

  • 看起来你有一个 (2,2,3) 形状,并且你想转置为 (3,2,2)
  • seq.transpose(2, 0, 1)
  • @MateenUlhaq 完美运行,谢谢!

标签: python arrays numpy numpy-ndarray


【解决方案1】:

您可以使用语义更好的einops。 对于您的情况,以下简单代码有效。

from einops import rearrange

def remap_image(seq):
    return rearrange(seq, 'w h t -> t w h')

【讨论】:

  • 酷包。显然我已经给它加了星,但在那之后就再也没有使用过它。毕竟这是一个额外的依赖。
【解决方案2】:

按照 Mateen Ulhaq 所说的,简单地说

def remap_image(seq):
    return seq.transpose(2, 0, 1)
    

【讨论】:

    【解决方案3】:

    我不确定它是否会更快,但你可以使用 zip():

    a = [
      [
        ["a1", "a2", "a3"], ["b1", "b2", "b3"]
      ],
      [
        ["c1", "c2", "c3"], ["d1", "d2", "d3"]
      ]
    ]
    
    b = (list(map(list,zip(*r))) for r in a)
    b = list(map(list,zip(*b)))
    
    print(b)
    
    [
     [
        ['a1', 'b1'],
        ['c1', 'd1']
     ],
     [
        ['a2', 'b2'],
        ['c2', 'd2']
     ],
     [
        ['a3', 'b3'],
        ['c3', 'd3']
     ]
    ]
    

    如果您的数据在一个 numpy 数组中,那么 b = np.transpose(a,axes=(2,0,1)) 会直接且非常快速地完成。

    【讨论】:

      猜你喜欢
      • 2018-05-01
      • 2020-05-16
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 2023-04-08
      • 2019-04-04
      • 1970-01-01
      相关资源
      最近更新 更多