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

问题描述

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

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

arr_sub = array([[ x,id_5]])

想要的输出

arr_remain = array([[ x,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 行,这还不够。

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

解决方法

这是一种方法:

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