首页 > 解决方案 > numpy中的重塑功能

问题描述

我正在尝试为图像分类目的重塑数据。我想将形状 (32,32,3) 转换为 (1,3,32,32)。我使用了两种方法进行整形,得到了不同的结果。第一个是 numpy reshape 方法。其他代码是我写的。

def res(t):
    n = np.zeros((3,32,32))

    for j in range(3):
        for k in range(32):
            for l in range(32):
                n[j][k][l]=t[k][l][j]

    n=n.reshape(1,3,32,32)
    return n

我无法理解这两种方法之间的区别。

标签: pythonimagenumpypytorchreshape

解决方案


这就是你想要做的np.reshape之后transpose-

new = original.transpose(2,0,1).reshape(1,3,32,32)
#(32,32,3)->(3,32,32)->(1,3,32,32)

##OR##

new = original.transpose(2,0,1)[None,...]
#(32,32,3)->(3,32,32)->(1,3,32,32)

完整的代码,比较你的函数和转置方法的结果。

t = np.random.random((32,32,3))

def res(t):
    n = np.zeros((3,32,32))

    for j in range(3):
        for k in range(32):
            for l in range(32):
                n[j,k,l]=t[k,l,j]  #<--- fixed indexing

    n=n.reshape(1,3,32,32)
    return n

## METHOD Transpose and Reshape
np.allclose(t.transpose(2,0,1).reshape(1,3,32,32), res(t))
#True

## METHOD Transpose and new axis
np.allclose(t.transpose(2,0,1)[None,...], res(t))
#True

推荐阅读