Python中根据第一列按行并集2d数组

Python中根据第一列按行并集2d数组,python,numpy,Python,Numpy,我试图根据第一列找到两个二维数组的并集: >>> x1 array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> x2 array([[ 7, -1, -1], [10, 11, 12]]) 如果两行具有匹配的第一个值,则我需要来自x2的值。也就是说,x1[:,0]和x2[:,0]的第一列的并集是[1,4,7,10],我希望行[7,-1,-1]来自x2,不是[7,8,9]来自x1。这种

我试图根据第一列找到两个二维数组的并集:

>>> x1
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> x2
array([[ 7, -1, -1],
       [10, 11, 12]])
如果两行具有匹配的第一个值,则我需要来自
x2
的值。也就是说,
x1[:,0]
x2[:,0]
的第一列的并集是
[1,4,7,10]
,我希望行
[7,-1,-1]
来自
x2
不是
[7,8,9]
来自
x1
。这种情况下的预期结果是:

>>> res
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7, -1, -1],
       [10, 11, 12]])
我发现有一种可能的二维数组并集解决方案,我得到的结果是:

>>> res
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7, -1, -1],
       [ 7,  8,  9],
       [10, 11, 12]]) 
在这个结果中,我希望排除
x1
中的
[7,8,9]
行。我该怎么做呢?

您可以使用and,将
x2
放在第一位。Unique可以根据第一次出现的值计算值的索引:

values = np.concatenate((x2[:, 0], x1[:, 0]))
_, index = np.unique(values, return_index=True)
mask = index >= x2.shape[0]
result = np.concatenate((x1[index[mask] - x2.shape[0], :], x2[index[~mask], :]), axis=0)
结果正是您期望的阵列:

array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7, -1, -1],
       [10, 11, 12]])

请记住,
unique
的结果是经过排序的,恰好与原始顺序对应。通过巧妙地应用
return\u inverse=True
,您可以获得原始顺序,这将留给读者作为练习。

当x2中的行是首选行时,
意味着什么?所有5行都是两个数组的并集。你为什么要接受[7,-1,-1]而不是[7,8,9]?您是说希望每行的第一个数字是唯一的吗?如果是这样的话,为什么不直接对它们进行迭代,删除您已经遇到的第[0]行中包含数字的任何行。我认为删除x1中第0行与第x1和X2行堆栈的交点也可以。如果矩阵中的行重复呢?