【问题标题】:Interleaving last axis of n-d numpy arrays交错 n-d numpy 数组的最后一个轴
【发布时间】:2021-04-16 23:18:59
【问题描述】:

假设给定以下数组:

a = array([[[4, 7, 1],
        [3, 8, 1],
        [0, 3, 7],
        [1, 5, 5],
        [1, 7, 6]],

       [[8, 1, 0],
        [2, 1, 4],
        [1, 7, 2],
        [6, 2, 0],
        [3, 2, 6]],

       [[4, 3, 1],
        [0, 3, 9],
        [1, 6, 2],
        [6, 5, 7],
        [1, 3, 2]],

       [[7, 3, 7],
        [8, 1, 3],
        [9, 9, 4],
        [2, 6, 8],
        [4, 4, 5]],

       [[4, 8, 1],
        [2, 0, 3],
        [4, 8, 9],
        [3, 7, 2],
        [7, 3, 1]]])
b = array([[[8, 3, 2],
        [1, 7, 9],
        [0, 0, 6],
        [1, 0, 1],
        [6, 0, 2]],

       [[1, 0, 0],
        [8, 6, 9],
        [8, 2, 2],
        [6, 6, 5],
        [2, 0, 8]],

       [[6, 2, 4],
        [4, 5, 4],
        [4, 7, 4],
        [3, 7, 8],
        [0, 9, 5]],

       [[7, 9, 0],
        [5, 4, 9],
        [7, 5, 9],
        [0, 0, 5],
        [4, 7, 2]],

       [[0, 2, 0],
        [4, 7, 7],
        [6, 7, 6],
        [2, 5, 3],
        [6, 0, 5]]])

如何将行交错以使形状为 (5, 5, 6) 并且最后一个轴上的值为

4, 8, 7, 3, 1, 2

对于该行的其余部分重复此操作。我已经尝试过来自Interweaving two numpy arrays 的示例,但它不起作用,因为重塑导致形状不匹配。非常感谢一个 numpy 解决方案。

【问题讨论】:

  • 链接问题的公认答案不正是您想要的吗? c = np.empty((5, 5, 6), dtype=a.dtype); c[...,0::2] = a; c[...,1::2] = b; c[0,0]?
  • 我会尝试将它们重塑为 (5,5,3,1),在最后一个轴上连接以获得 (5,5,3,2)。最后重塑为(5,5,6)`
  • @Reti43 很好,有没有办法通过 dstack 等操作来做到这一点?我想避免对索引进行硬编码
  • 你不必硬编码,我只是为了方便而做了。 s = a.shape; new_shape = (s[0], s[1], 2*s[2])。或者,如果您想让它更通用,new_shape = s[:-1] + (2*s[-1],)

标签: python arrays numpy


【解决方案1】:

您可以先stack 沿新轴(即此处的第 4 轴)的两个数组,然后将最后两个维度展平,这将在原始数组的第 3 轴上交错元素:

np.stack((a, b), axis=-1).reshape(a.shape[:-1] + (-1,))

#[[[4 8 7 3 1 2]
#  [3 1 8 7 1 9]
#  [0 0 3 0 7 6]
#  [1 1 5 0 5 1]
#  [1 6 7 0 6 2]]
# ...

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 2019-03-29
    • 2020-08-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    相关资源
    最近更新 更多