Python:如何使用`numpy.all`和`numpy.any`检查一个数组是否包含在另一个数组中?

4
我正在使用scikit-image来检测图像上的特定区域。我已经成功使用blob_doh函数检测到了斑点。同时,我也使用Canny边缘检测器和标签法找到了区域。
现在,我想检查之前找到的斑点是否在这些区域内,并筛选出不在任何一个区域内的斑点。然后,我只想绘制那些在区域内的斑点。
我试图使用numpy.allnumpy.any来实现这一点,但我可能对这些函数的工作方式有所误解。以下是我的代码:
for region in regions:
    # list of pixels' coords in a region
    pixel_array = region.coords

    # check if a blob is inside the region
    for blob in blobs_doh:
        y, x, r = blob

        if np.any(pixel_array == [x, y]):
            c = plt.Circle((x, y), r, color='red', linewidth=1, fill=False)
            minr, minc, maxr, maxc = region.bbox
            rect = mpatches.Rectangle((minc, minr), maxc - minc, maxr - minr, fill=False, edgecolor='lime', linewidth=1)
            # draw blobs and regtangles
            ax.add_patch(c)
            ax.add_patch(rect)
            break

所以,我的工作是什么。 region 是一个形状为[[a1, b1], [a2, b2], [a3, b3], ..., [an, bn]]的数组,而 blob 是一个形状为[c, d]的数组。我的想法是检查是否有任何子数组在region中等于blob。当然,我可以通过循环遍历来做到这一点,但我认为还有更有效的方法,并尝试使用numpy.allnumpy.any。不幸的是,我不能正确地使其工作。行np.any(pixel_array == [x, y])仅检查blob的第一个元素,而不是整个子数组[x, y]。我也尝试了使用axis参数的.any.all的不同组合:
np.any(pixel_array == [x, y], axis = 1).all(axis = 0)

但是我没有得到任何可接受的结果。

请帮忙完成这个任务。有什么更好的方法来执行这样的检查吗?

谢谢。


1
请查看https://dev59.com/DG7Xa4cB1Zd3GeqPu-Rv#15068334。 - nicolallias
1个回答

3
如果将pixel_array转换成列表,你就可以做到这一点。不确定这样做的效率如何,但这个方法是可行的:
if [x,y] in pixel_array.tolist():

编辑:

看起来有人已经在这个答案中计时了许多不同的选项。上面的tolist()解决方案还不错,但在各种情况下最好的选择似乎是:

 if any(np.equal(pixel_array,[x,y]).all(1)):

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接