gpt4 book ai didi

python - 基于连通邻域的 boolean 交集 - NumPy/Python

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:52 27 4
gpt4 key购买 nike

有这两个数组:

import numpy as np

arr1 = np.array([[0,0,0,0,1,0],
[0,0,0,0,0,0],
[0,0,0,0,0,0],
[0,1,0,0,1,0],
[0,0,0,0,0,0]], dtype=bool)

arr2 = np.array([[0,1,1,0,0,0],
[0,1,1,0,0,0],
[0,0,0,0,1,1],
[1,1,0,0,1,1],
[1,1,0,0,0,0]], dtype=bool)

我需要一种逻辑操作,将 arr2 中被 arr1 拦截的任何连接特征返回为 True。结果应该是这样的:

arr3 = np.array([[0,0,0,0,0,0],
[0,0,0,0,0,0],
[0,0,0,0,1,1],
[1,1,0,0,1,1],
[1,1,0,0,0,0]], dtype=bool)

我检查了 python 中的逻辑操作和 numpy logic functions ,但似乎没有任何效果。有任何想法吗?谢谢:)

最佳答案

方法 #1

我们可以使用基于图像处理的标记函数根据连通性标记图像,然后使用掩蔽来获得我们想要的输出。要进行标记,我们可以使用 skimage.measure.label .或者,我们也可以使用 scipy.ndimage.label得到那个标记的图像。因此,一种解决方案是 -

from skimage.measure import label as sklabel

def func1(arr1,arr2):
# Get labeled image
L = sklabel(arr2)

# Get all present labels (this would also include zero label)
present_labels = L[arr1]

# Get presence of these labels in the labeled image. Remove the zero regions
# by AND-ing with arr2.
return np.isin(L,present_labels) & arr2

给定样本的输出-

In [141]: func1(arr1,arr2)
Out[141]:
array([[False, False, False, False, False, False],
[False, False, False, False, False, False],
[False, False, False, False, True, True],
[ True, True, False, False, True, True],
[ True, True, False, False, False, False]])

方法 #2

对于大 blob,我们应该在使用 np.isin 之前获取唯一的当前标签以提高性能。为了有效地获得那些独特的,我们可以使用 pandas.factorize。标签部分也可以通过使用 SciPy 版本来提高性能。因此,对于这种情况,另一种更有效的解决方案是 -

from scipy.ndimage import label as splabel
import pandas as pd

def func2(arr1,arr2):
L = splabel(arr2)[0]
pL = pd.factorize(L[arr1])[1]
return np.isin(L,pL[pL!=0])

基准测试

我们将使用给定的示例数据,沿行和列将其放大 1000x,同时保持相同数量的 blob。为了扩大规模,我们将使用 np.repeat -

In [147]: arr1 = arr1.repeat(1000, axis=0).repeat(1000, axis=1)

In [148]: arr2 = arr2.repeat(1000, axis=0).repeat(1000, axis=1)

In [149]: %timeit func1(arr1,arr2)
...: %timeit func2(arr1,arr2)
1.75 s ± 7.01 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
226 ms ± 5.99 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 基于连通邻域的 boolean 交集 - NumPy/Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57022175/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com