Python 基于另一个数组列的 numpy 数组行提取 - 需要更快的解决方案

Python numpy array row extraction based on another's array column - faster solution required

给出了两个二维 numpy 数组(arr_all 和 arr_sub),而第二个是第一个的随机子集。我需要根据两个数组中都存在的一列中的 ID 获取第二个行 (arr_sub) 中未包含的第一个行 (arr_all) 的行。 例如:

arr_all = array([[ x,  y,  z,  id_1],
#        [x,  y,  z,  id_2],
#        [x,  y,  z,  id_3],
#        [x,  y,  z,  id_4],
#        [x,  y,  z,  id_5]])

arr_sub = array([[ x,  y,  z,  id_1],
#        [x,  y,  z,  id_2],
#        [x,  y,  z,  id_5]])

想要的输出:

arr_remain = array([[ x,  y,  z,  id_3],
#        [x,  y,  z,  id_4]])

可行的解决方案是:

list_remain = []
for i in range(len(ds_all)):
if ds_all[i][3] not in ds_trees[:,3]:
    list_remain.append(ds_all[i])

arr_remain = np.array(list_remain)

不幸的是,这个解决方案只适用于小型数据集,因为它的运行时间非常慢。由于我的原始数据集包含超过 26 个 mio 行,这还不够。

我尝试采用像 , or 这样的解决方案,但我没有设法添加检查 ID 是否存在于其他数组列中。

这是一种方法:

arr_remain = arr_all[~np.in1d(arr_all[:,-1], arr_sub[:,-1])]
# or arr_remain = arr_all[~np.isin(arr_all[:,-1], arr_sub[:,-1])]
输出:
array([['x', 'y', 'z', 'id_3'],
       ['x', 'y', 'z', 'id_4']], dtype='<U4')