有没有一种方法可以在一个批处理操作中从一个2D numpy数组中切出多个2D numpy数组?

时间:2019-11-28 10:01:18

标签: numpy numpy-slicing numpy-indexing

我有一个形状为heatmap的numpy数组(img_height, img_width)和另一个形状为bboxes的数组(K, 4),其中K是许多边界框。 每个边界框都已定义 像这样:[x_top_left, y_top_left, width, height]。 这是此类数组的示例:

bboxes = np.array([
    [0, 0, 4, 7],
    [3, 4, 3, 4],
    [7, 2, 3, 7]
])

heatmap最初用零填充。 我需要做的是将每个边界框的值1放在对应的位置。 结果heatmap应该是:

heatmap = np.array([
    [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
    [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
    [1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0],
    [1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0],
    [1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0],
    [1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0],
    [1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0],
    [0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
])

重要注意事项:

  • 轴0对应于图像高度
  • 轴1对应于图像宽度

我已经使用python for循环解决了这个问题,像这样:

for bbox in bboxes:
    #       y_top_left:y_top_left + img_height, x_top_left:x_top_left + img_width
    heatmap[bbox[1] : bbox[1] + bbox[3], bbox[0] : bbox[0] + bbox[2]] = 1

我想避免使用python进行循环(如果可能),并且能够执行以下操作:

heatmap[bboxes[:,1] : bboxes[:,1] + bboxes[:,3], bboxes[:,0]:bboxes[:,0] + bboxes[:,2]] = 1

有没有办法在numpy中进行这种多重切片?

我知道numpy integer array indexing,但是要生成这样的索引,我也无法避免使用python for循环。

0 个答案:

没有答案