需要更快的解决方案

kyvafyod  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(440)

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

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)

然而不幸的是,这个解决方案只适用于小数据集,因为它的运行速度非常慢。由于我的原始数据集包含超过2600万行,这是不够的。
我尝试采用这样、这样或这样的解决方案,但我没有设法在“其他数组”列中添加id是否存在的检查。

shyt4zoc

shyt4zoc1#

这里有一个方法:

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')

相关问题