我有两个带有相同形状的2D numpy数组a
和b
。我想通过类似于两个数组中GIS geometric union的内容重新标记数组b
,以便单元格在数组a
和{{{{}}中具有唯一值组合1}}被分配了新的唯一ID:
我不关心输出中区域的具体编号,只要这些值都是唯一的。我在下面附加了样本数组和所需的输出:我的真实数据集要大得多,两个数组都有整数标记,范围从“1”到“200000”。到目前为止,我已尝试连接数组ID以形成唯一的值组合,但理想情况下,我希望以1,2,3等形式输出一组简单的新ID。
b
答案 0 :(得分:3)
如果我理解了具体情况,您希望a
和b
拥有独特的配对。因此,1
的{{1}}和a
的{{1}}在输出中会有一个唯一的标记;来自1
的{{1}}和来自b
的{{1}}在输出中会有另一个唯一标记。同时在问题中查看所需的输出,似乎还有一个额外的条件情况,即如果1
为零,则无论唯一配对如何,输出都为零。
以下实现尝试解决所有问题 -
a
示例运行 -
3
样本图 -
b
答案 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和bnp.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]])
在这种情况下,联合应该大于或等于其合成的属性反映在增加的数值而不是元素数量的增加。