如何在NumPy数组中选择除了一系列索引之外的所有元素

46

假设我有一个很长的数组和一个索引列表,如何选择除了这些索引之外的所有内容?我找到了一个解决方案,但它并不优雅:

import numpy as np
x = np.array([0,10,20,30,40,50,60])
exclude = [1, 3, 5]
print x[list(set(range(len(x))) - set(exclude))]

可能重复:https://dev59.com/XGs05IYBdhLWcg3wIOfS - Alper Fırat Kaya
2
@AlperFıratKaya,你的链接只删除一个元素,而不是一组元素。 - hpaulj
4个回答

54

这就是numpy.delete的作用。(它不会修改输入的数组,所以您不必担心。)

In [4]: np.delete(x, exclude)
Out[4]: array([ 0, 20, 40, 60])

28

np.delete 根据输入的不同有多种用法,但在这种情况下,它使用类似于以下形式的掩码:

In [604]: mask = np.ones(x.shape, bool)
In [605]: mask[exclude] = False
In [606]: mask
Out[606]: array([ True, False,  True, False,  True, False,  True], dtype=bool)
In [607]: x[mask]
Out[607]: array([ 0, 20, 40, 60])

1
最佳解决方案,我认为也是最可向量化和高效的方案。 - Joey Carson
@JoeyCarson,请问您能否解释一下为什么这比已接受的更好? - Shihab Shahriar Khan
1
根据numpy.delete文档,“通常最好使用布尔掩码...[它]等同于np.delete(...),但允许进一步使用掩码。” - nish-ant

8

np.in1dnp.isin可以创建基于exclude的布尔索引,是一种替代方案:

x[~np.isin(np.arange(len(x)), exclude)]
# array([ 0, 20, 40, 60])

x[~np.in1d(np.arange(len(x)), exclude)]
# array([ 0, 20, 40, 60])

1
这样做的好处是可以在赋值中使用。不过,我还在想是否有更高效的方法... - Paul Panzer

-1

你也可以使用列表推导式来获取索引

>>> x[[z for z in range(x.size) if not z in exclude]]
array([ 0, 20, 40, 60])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接