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行堆栈的交点也可以。如果矩阵中的行重复呢?