在两个numpy数组中标记具有唯一值组合的区域?

时间:2015-09-01 06:59:42

标签: python arrays numpy scipy python-2.6

我有两个带有相同形状的2D numpy数组ab。我想通过类似于两个数组中GIS geometric union的内容重新标记数组b,以便单元格在数组a和{{{{}}中具有唯一值组合1}}被分配了新的唯一ID:

enter image description here

我不关心输出中区域的具体编号,只要这些值都是唯一的。我在下面附加了样本数组和所需的输出:我的真实数据集要大得多,两个数组都有整数标记,范围从“1”到“200000”。到目前为止,我已尝试连接数组ID以形成唯一的值组合,但理想情况下,我希望以1,2,3等形式输出一组简单的新ID。

b

2 个答案:

答案 0 :(得分:3)

如果我理解了具体情况,您希望ab拥有独特的配对。因此,1的{​​{1}}和a的{​​{1}}在输出中会有一个唯一的标记;来自1的{​​{1}}和来自b的{​​{1}}在输出中会有另一个唯一标记。同时在问题中查看所需的输出,似乎还有一个额外的条件情况,即如果1为零,则无论唯一配对如何,输出都为零。

以下实现尝试解决所有问题 -

a

示例运行 -

3

样本图 -

b

enter image description here

enter image description here

enter image description here

答案 1 :(得分:1)

这是一种在集合联合方面的概念上,但不是GIS几何联合的方法,因为在我回答之后就提到了这一点。

列出所有可能唯一的2元组值,其中一个来自a,另一个来自b。将该列表中的每个元组映射到其中的索引。使用该映射创建联合数组。

例如,假设a和b是每个都包含范围(4)中的值的数组,并且为了简单起见,它们具有相同的形状。然后:

v = range(4)
from itertools import permutations
p = list(permutations(v,2))
m = {}
for i,x in enumerate(p):
    m[x] = i
union = np.empty_like(a)
for i,x in np.ndenumerate(a):
    union[i] = m[(x,b[i])]

为了演示,使用

生成a和b
np.random.randint(4, size=(3, 3))

制备:

a = array([[3, 0, 3],
           [1, 3, 2],
           [0, 0, 3]])

b = array([[1, 3, 1],
           [0, 0, 1],
           [2, 3, 0]])

m = {(0, 1): 0,
     (0, 2): 1,
     (0, 3): 2,
     (1, 0): 3,
     (1, 2): 4,
     (1, 3): 5,
     (2, 0): 6,
     (2, 1): 7,
     (2, 3): 8,
     (3, 0): 9,
     (3, 1): 10,
     (3, 2): 11}

union = array([[10,  2, 10],
               [ 3,  9,  7],
               [ 1,  2,  9]])

在这种情况下,联合应该大于或等于其合成的属性反映在增加的数值而不是元素数量的增加。