说我有一个numpy的二维数组,像:

>>> 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中不在边界框内的所有项目都变为零:

>>> 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]])


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

最佳答案

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

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]


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

关于python - 在边界框之外的numpy 2d数组中使所有零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60325518/

10-11 05:05
查看更多