我有三个具有不同行数的相当大的NumPy
数组,它们的第一列都是整数
。我的希望是过滤这些数组,使得只有那些第一列的值被所有三个数组共享的行留下来。这将留下三个相同大小的数组。其他列中的条目在数组之间未必共享。
因此,输入如下:
A =
[[1, 1],
[2, 2],
[3, 3],]
B =
[[2, 1],
[3, 2],
[4, 3],
[5, 4]]
C =
[[2, 2],
[3, 1]
[5, 2]]
I hope to get back as output:
A =
[[2, 2],
[3, 3]]
B =
[[2, 1],
[3, 2]]
C =
[[2, 2],
[3, 1]]
我的当前方法是:
使用
numpy.intersect1d()
找到三个第一列的交集在此交集和每个数组的第一列上使用
numpy.in1d()
,找到在每个数组中没有共享的行索引(使用此处找到的方法的修改版本将boolean
转换为索引:Python: intersection indices numpy array)最后,使用
numpy.delete()
与每个索引及其相应的数组,删除具有非共享条目的第一列的行。
但我想知道是否有更快或更优雅的 Pythonic 方法来处理这个问题,特别是适用于非常大的数组。
searchsorted
只会返回每个整数的第一个实例。这是一个常见的用例,例如数据库中的主键,但你应该在答案中注意到这一点。 - Bi Riconp.searchsorted
找到匹配项,例如idx = np.searchsorted(I, B[:, 0]); idx[idx == len(I)] = -1; B[I[idx] == B[:, 0]]
即使B
未排序也可以工作。 - Jaime