Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除包含在另一个数组中的1d数组中的值_Python_Arrays_Python 3.x_Numpy - Fatal编程技术网

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)