NumPy阵列上的反向叠加操作

2024-09-29 19:28:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一行代码可以有效地将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的代码行:

^{pr2}$

有什么想法可以反向执行这行代码吗?在

谢谢:D


Tags: 代码ingtfor过程range数组block
2条回答

^{}怎么了?在

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

重塑、交换轴(或转置轴)并重塑以使overDone返回-

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

有关^{}的详细信息。在

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

^{pr2}$

样本运行-

# 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)

相关问题 更多 >

    热门问题