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')
给出了两个二维 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 行,这还不够。
我尝试采用像
这是一种方法:
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')