在边界框外的numpy二维数组中使所有零为零

问题描述 投票:0回答:1

说我有一个类似numpy的2d数组:

>>> ar
array([[1, 2, 3, 1, 2, 3, 1, 7, 2, 3],
       [4, 3, 2, 4, 5, 5, 6, 5, 2, 1],
       [5, 4, 2, 4, 6, 2, 4, 2, 1, 4],
       [1, 5, 6, 1, 4, 2, 2, 4, 1, 4],
       [7, 4, 5, 6, 2, 5, 3, 5, 6, 7]])

我如下定义一个边界框,并且我希望ar中边界框中not的所有项目都变为零:

>>> my_bbox = ((2, 7), (1, 3))

>>> make_zeros(ar, bounding_box)
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 2, 4, 5, 5, 6, 5, 0, 0],
       [0, 0, 2, 4, 6, 2, 4, 2, 0, 0],
       [0, 0, 6, 1, 4, 2, 2, 4, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

除了“显而易见的”(又丑陋且低效的)循环方法之外,是否存在切片/矢量类型的操作来实现这一目标?我相信阵列掩码可能会起作用,但不确定具体如何。

python python-3.x numpy
1个回答
0
投票

您可能想要创建数组的副本,然后在其顶部写入所需的子矩阵:

ar_zeroed = np.zeros(ar.shape).astype(int)
slice1, slice2 = slice(my_bbox[0][0], my_bbox[0][1]+1),
                 slice(my_bbox[1][0], my_bbox[1][1]+1)
ar_zeroed[slice2, slice1] = ar[slice2, slice1]

请注意,尺寸已在边界框中交换

© www.soinside.com 2019 - 2024. All rights reserved.