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

时间:2015-06-25 08:18:37

标签: python arrays python-2.7 numpy scikit-image

我正在使用scikit-image检测图像上的某些区域。我能够使用blob_doh函数检测blob。我还能够使用Canny edge detector和标签查找区域。

现在我想检查一下我之前发现的blob是否在这些区域内,并检查那些不属于任何区域的blob。然后我想只画出区域内的斑点。

我试图使用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]的元素。我还使用.any参数尝试了.allaxis的不同组合:

np.any(pixel_array == [x, y], axis = 1).all(axis = 0)

但无法获得任何可接受的结果。

请帮我完成这项任务。执行此类检查的更好方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果将pixel_array转换为列表,则可以执行此操作。不确定会有多高效,但这有效:

if [x,y] in pixel_array.tolist():

修改

看起来某人已经计划了很多不同的选项in this answer。上面的tolist()解决方案并不算太差,但是在一系列场景中最好的选择似乎是:

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