【问题标题】:How to extract a sub-array in numpy efficiently?如何有效地提取numpy中的子数组?
【发布时间】:2015-07-30 19:30:27
【问题描述】:

我有一个 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 是作为一维数组(列表)给出的所需子图像。它们是相同的,我只是想测试哪种方式更快。令人惊讶的是,生成vec_2 比生成vec_1 需要更多时间。但是,根据this answer我的问题,预计它会更快。那么,为什么它没有更快呢?

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

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

【问题讨论】:

  • 你知道切片吗?
  • @cfh,不(some_symbols_to_make_it_acceptably_long)。

标签: python arrays numpy optimization


【解决方案1】:

你应该使用 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 索引的documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2017-03-15
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多