性能:有效地切片和反转Numpy数组

时间:2017-01-24 20:40:01

标签: python arrays performance numpy slice

我想计算10幅图像:左上角,右上角,左下角,右下角,中心,以及所有图像都是镜像的。图像存储在Numpy数组blob中,形状为N x Channels x Height x Width,其中N是源图像的数量。

切片的左上角存储在tls中,切片的右下角点存储在brs中。以下代码提取作物以及每种作物的水平镜像版本:

m = 10 if mirror else 5
crops_shape = ((blob.shape[0] * m,) + blob.shape[1:-2] + crop_dimensions)
crops = np.empty(shape=crops_shape, dtype=blob.dtype)

for i in range(0, blob.shape[0]):
    p = i * m
    for k, (tl, br) in enumerate(zip(tls, brs)):
        crops[p + k] = blob[i, ..., tl[0]:br[0], tl[1]:br[1]]
    if mirror:
        crops[p + 5:p + 10] = crops[p:p + 5, ..., ::-1]

return crops

对于单个图像,blob例如可以具有形状(1,3,226,226)。所有作物都具有相同的大小,例如(227x227),因此结果数组crops在这种情况下将具有形状(10,3,227,227)(当mirror为真时)

不幸的是,当blobfloat32数组时,上面的方法太慢(大约1.5ms /图像)。有没有办法让这更快?

0 个答案:

没有答案