【问题标题】:Remove values in 1d array contained in another array [duplicate]删除另一个数组中包含的一维数组中的值[重复]
【发布时间】:2020-06-09 10:39:23
【问题描述】:

我有一个项目,我必须从某个数组中删除活动并将其存储在另一个数组中。

例如:

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_active 中的元素(如果它们已经在select_act 中)。我上面的代码适用于给定的示例。但是,假设q_active 中的所有活动都已经在select_act 中,

q_active = [2, 3]
select_act = [2, 3]

我不断收到的output 保持不变:

new_q_active = []

有什么建议我为什么一直这样吗?任何帮助,将不胜感激!谢谢!

【问题讨论】:

  • 值得询问您是否真的关心订购。如果没有,那么set(q_active) - set(select_act) 将是实现这一目标的有效方法。 (可以使用list() 将其转换回列表,但顺序将是未定义的。)

标签: python arrays python-3.x numpy


【解决方案1】:

有重复项

一般来说,在迭代时删除并不是一个好主意,因为you can easily skip values。一种方法是从np.isin 的结果中定义一个布尔掩码,并使用它来索引q_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])

没有重复

还可能值得一提的是np.setdiff1d,如果没有重复,顺序并不重要是不错的选择:

select_act = np.array([2])
q_active = np.array([4, 2, 3])

np.setdiff1d(q_active, select_act)
# array([3, 4])

两种方法之间的比较(有趣的是我们不想保留重复的情况,否则需要前者):

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)

【讨论】:

    【解决方案2】:

    根据您是否需要使用 numpy(这对于这项任务来说似乎有点过分),您可以通过使用集合论来实现这一点:

    new_q_active = list(set(q_active).difference(set(select_act)))

    或者,列表推导也可以解决问题:

    new_q_active = [x for x in q_active if x not in select_act]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多