【问题标题】:Reverse stacking operation on NumPy arrayNumPy 数组的反向堆叠操作
【发布时间】:2019-04-02 20:49:39
【问题描述】:

我有一行代码可以有效地将一个 numpy 数组从 400x8x8 数组重塑为 160x160 数组,我需要反转该过程,但无法弄清楚该行的反转。

我已经可以执行此过程,但效率非常低,并且需要嵌套循环,出于性能目的,我希望避免使用。

这是我目前必须反转该过程的代码(160x160 > 400x8x8):

       previousRow = 0
    for rowBlock in range(noBlocksOn1Axis):
        previousRow = rowBlock * blockSize  
        previousColumn = 0
        for columnBlock in range(noBlocksOn1Axis):
            previousColumn = columnBlock * blockSize
            block = 
            arrayY[previousRow:previousRow+blockSize, 
            previousColumn:previousColumn + blockSize]
            blocksList.append(block) 

这是重塑 400x8x8 > 160x160 的代码行:

    xy = np.zeros((160,160), dtype = np.uint8)

    xy = np.vstack(np.hstack(overDone[20*i:20+20*i]) for i in 
    range(overDone.shape[0]//20))

那么关于如何反向执行这行代码有什么想法吗?

谢谢:D

【问题讨论】:

    标签: python arrays numpy vectorization reshape


    【解决方案1】:

    重新整形、交换轴(或转置轴)并重新整形以获取 overDone 返回 -

    xy.reshape(20,8,20,8).swapaxes(1,2).reshape(400,8,8)
    

    更多关于intuition behind nd-to-nd array transformation的信息。

    使其通用以处理通用形状 -

    m,n = xy.shape
    M,N = 20,20 # block size used to get xy
    overDone_ = xy.reshape(M,m//M,N,n//N).swapaxes(1,2).reshape(-1,m//M,n//N)
    

    示例运行 -

    # Original input
    In [21]: overDone = np.random.rand(400,8,8)
    
    # Perform forward step to get xy
    In [22]: xy = np.vstack(np.hstack(overDone[20*i:20+20*i]) for i in range(overDone.shape[0]//20))
    
    # Use proposed approach to get back overDone
    In [23]: out = xy.reshape(20,8,20,8).swapaxes(1,2).reshape(400,8,8)
    
    # Verify output to be same as overDone
    In [42]: np.array_equal(out,overDone)
    Out[42]: True
    

    奖金:

    我们可以使用相同的矢量化reshape+permute-axes 步骤来为转发过程创建xy -

    xy = overDone.reshape(20,20,8,8).swapaxes(1,2).reshape(160,160)
    

    【讨论】:

    • 你也应该在这里展示更有效的前向操作方法
    • @Eric 好主意!已添加。
    【解决方案2】:

    numpy.reshape 有什么问题?

    my_array_3d = my_array.reshape((400, 8, 8))
    my_array_2d = my_array.reshape((160, 160))
    

    【讨论】:

      猜你喜欢
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多