繁体   English   中英

如何有效地提取numpy中的子数组?

[英]How to extract a sub-array in numpy efficiently?

我有一个以3D numpy数组形式给出的图像(宽度,高度和颜色为尺寸)。 现在,我想提取给定形状的所有可能的子图像。 例如,原始图像的宽度和高度分别为300和200像素,我想提取宽度和高度分别等于10和20像素的所有子图像。 此外,我希望每个子图像都具有一维数组(为此,我需要指定特定的像素顺序)。

我通过以下方式解决问题:

for col0 in range(w_max - max_shift):
    x3s_new = [x + col0 for x in x3s]
    for row0 in range(h_max - max_shift):

        vec_1 = []
        for col_shift, row_shift in px_inds:
            col = col0 + col_shift
            row = row0 + row_shift
            vec_1 += [ia[row, col, 0], ia[row, col, 1], ia[row, col, 2]]

        y3s_new = [y + row0 for y in y3s]
        vec_2 = list(ia[y3s_new, x3s_new, z3s])

在上面的代码中,我遍历了代表图像的“矩阵”的列和行。 然后,将每个像素(由其列和行给定)视为子图像的左上角,并提取子图像。

vec_1vec_2是作为1D数组(列表)给出的所需子图像。 它们是相同的,我只是想测试哪种方法更快。 令人惊讶的是,生成vec_2时间比vec_1 但是,根据对我的问题的回答 ,它有望更快。 那么,为什么不快呢?

最后,我还想知道是否有比循环遍历图像矩阵的所有列和行更快的替代方法。

总而言之,我的问题是:如何以更快的方式达到我的需求? 目前,我大约需要5分钟来“处理”一张图像,这对我来说是不可接受的。

您应该使用Numpy切片。

给定3D numpy数组M ,您可以选择它的子数组,例如,

M_selection = M[i_min:i_max, j_min:j_max, k_min:k_max]

或者,明确定义切片,

sl_i = slice(i_min, i_max)
sl_j = slice(j_min, j_max)
sl_k = slice(k_min, k_max)
M_selection = M[sl_i, sl_j, sl_k]

其中(i_min, i_max)等是子数组的边界。

有关更多详细信息,请参见高级Numpy索引文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM