快速随机到numpy 2d区域的独特重新标记(无循环)

时间:2016-09-21 10:24:10

标签: python arrays numpy scipy vectorization

我有一个大的numpy 2d数组(10000,10000),其中随机标记区域(具有相同数字的单元簇)。结果,一些单独的区域被分配给相同的标签。我想要的是重新标记numpy 2d数组,以便将所有单独的区域分配给唯一标签(参见示例)。

我现在如何用循环来解决这个问题。但是当我使用大量小区域的大型阵列时,这个过程需要很长时间。因此,矢量化方法会更合适。

示例:

- 两个单独的区域标有1
- 两个独立的地区    标有3

String post_param_1 = request.getParameter("param_1");
if (post_param_1 != null && post_param_1.matches(regex)) {
    // param present and valid
}

random

## Input
random_arr=np.array([[1,1,3,3],[1,2,2,3],[2,2,1,1],[3,3,3,1]])

unique

带循环的缓慢解决方案:

## Apply function
unique_arr=relabel_regions(random_arr)
## Output
>>> unique_arr
array([[1, 1, 3, 3],
       [1, 2, 2, 3],
       [2, 2, 4, 4],
       [5, 5, 5, 4]])

1 个答案:

答案 0 :(得分:4)

让我们作弊,然后使用一些高质量的图书馆(scikit-image)来提供这个。

您可以从它的实施中学习,或者只是使用它!

import numpy as np
from skimage.measure import label

random_arr = np.array([[1,1,3,3],[1,2,2,3],[2,2,1,1],[3,3,3,1]])
labels = label(random_arr, connectivity=1)  # neighborhood-definition here!

print(labels)

输出

[[1 1 2 2]
 [1 3 3 2]
 [3 3 4 4]
 [5 5 5 4]]

编辑:正如Jeon在评论中提到的那样,如果不想再使用一个额外的库,scipy的scipy.ndimage.measurements.label也可能成为候选者!感谢Jeon的评论!