【问题标题】:Trouble Reshaping Nd-array重塑 Nd 阵列的麻烦
【发布时间】:2019-05-15 23:37:23
【问题描述】:

我在 Python 中工作,我有一个形状为 [100,3,200,1200] 的图像数组。该数组的格式为 Number_of_images x Channels x Height x Width。我想将图像沿宽度方向拆分为 6 个形状为 200x200 的图像,并将其添加为不同的通道。最终,我想收到一个形状为 [100,18,200,200] 的数组。

我尝试过使用 reshape 功能,但它没有按预期工作。我尝试了以下方法:

np.reshape([100,18,200,200])

当我绘制每张图像时,我注意到它没有按照我想要的方式裁剪图像。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    首先重塑以进行分割:

    a = np.reshape(a, (100, 3, 200, 6, 200))
    

    然后将分割轴移到通道轴之外:

    a = np.moveaxis(a, 3, 2)
    

    然后合并这两个轴:

    a = np.reshape(a, (100, 18, 200, 200))
    

    在这种情况下,18 个通道将被排序为:

    [red-split1, red-split2, red-split3, red-split4, red-split5, red-split6,
     green-split1, ..., green-split6,
     blue-split1, ..., blue-split6]
    

    如果将第二条指令更改为:

    a = np.moveaxis(a, 3, 1)
    

    坐标轴将被排序为:

    [red-split1, green-split1, blue-split1,
     ...,
     red-split6, green-split6, blue-split6]
    

    【讨论】:

    • 虽然从正确性的角度来看这当然很好,但请注意,从性能的角度来看,它可能是可取的,也可能不是可取的。第一个 reshapemoveaxis (或转置,其中 moveaxis 是一种特殊情况)不需要对内存中值的布局进行任何更改,因此它们的结果只是原始数组的视图和操作执行得非常快。但是,第二个reshape,由于前面的轴旋转,无法保留内存中项目的顺序,因此必须创建数据的副本,这对于大数组可能会很慢。
    • @blubberdiblub 是的,感谢您指出这一点。这确实是一个重要的副本,如果 chhanels 是一个字节,则约为 70MB,如果它们是四个字节,则约为 275MB。不过,我认为如果我们想实现所要求的形状,没有办法避免复制。
    • 你是对的,在保留 Numpy 语义的同时,问题中提供的数据是不可能的。但是,如果可以选择以不同的形状开始,其中宽度从一开始就靠近通道,这是可能的。例如(no_img, channels, width, height)(no_img, height, width, channels)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2012-07-24
    • 2023-03-09
    相关资源
    最近更新 更多