Python 删除包含在另一个数组中的1d数组中的值
我有一个项目,其中我必须从某个数组中删除活动并将其存储在另一个数组中 例如:Python 删除包含在另一个数组中的1d数组中的值,python,arrays,python-3.x,numpy,Python,Arrays,Python 3.x,Numpy,我有一个项目,其中我必须从某个数组中删除活动并将其存储在另一个数组中 例如: select_act = [2] q_active = [2, 3] 到目前为止,我的代码如下所示: for ele in select_act: new_q_active = numpy.delete(q_active, numpy.where(ele)) print(new_q_active) Output: new_q_active = [3] 目标是删除q\u active中的元素(如果它们已经在
select_act = [2]
q_active = [2, 3]
到目前为止,我的代码如下所示:
for ele in select_act:
new_q_active = numpy.delete(q_active, numpy.where(ele))
print(new_q_active)
Output: new_q_active = [3]
目标是删除q\u active
中的元素(如果它们已经在select\u act
中)。我上面的代码适用于给定的示例。但是,比方说,q\u active
中的所有活动都已在select\u act
中
q_active = [2, 3]
select_act = [2, 3]
我一直得到的输出保持不变:
new_q_active = []
有什么建议为什么我一直得到这个吗?任何帮助都将不胜感激!谢谢大家! 带有重复项
一般来说,在迭代时删除不是一个好主意,因为。一种方法是从的结果定义一个布尔掩码,并使用它来索引q\u active
。使用此方法可以保留重复值的所有实例:
select_act = np.array([2])
q_active = np.array([2, 3, 4, 2, 3])
m = np.isin(q_active, select_act, invert=True)
# array([ True, False])
q_active[m]
# array([3, 4, 3])
无重复项
可能还值得一提的是,在没有副本且顺序不重要的情况下,这是一个很好的选择:
select_act = np.array([2])
q_active = np.array([4, 2, 3])
np.setdiff1d(q_active, select_act)
# array([3, 4])
两种方法之间的比较(有趣的是,我们不想保留重复的方法,否则需要前者):
根据您是否需要使用numpy(对于此任务而言,这似乎有些过分),您可以使用集合论来实现这一点:
new\u q\u active=列表(设置(q\u active).差异(设置(选择动作))
或者,列表理解也可以做到这一点:
new\u q\u active=[x代表x在q\u active中,如果x不在select\u act中]
值得一问的是,您是否真正关心订购。如果没有,那么set(q\u active)-set(select\u act)
将是实现这一点的有效方法。(可以使用list()
将其转换回列表,但顺序将未定义。)
q_active = np.random.randint(1,20_000,10_000)
select_act = np.random.randint(1,20_000,5_000)
%%timeit
m = np.isin(q_active, select_act, invert=True)
q_active[m]
# 1.01 ms ± 14.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
m = np.in1d(q_active, select_act, invert=True)
q_active[m]
# 1.01 ms ± 26.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit np.setdiff1d(q_active, select_act)
# 808 µs ± 7.54 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)