【问题标题】:How to select all elements in a NumPy array except for a sequence of indices [duplicate]如何选择 NumPy 数组中除索引序列之外的所有元素 [重复]
【发布时间】:2017-11-28 20:57:55
【问题描述】:

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

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))]

【问题讨论】:

标签: python arrays numpy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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])
    

    【讨论】:

    • 最好的解决方案,我认为是最可矢量化和最有效的解决方案。
    • @JoeyCarson,你能解释一下为什么它比接受的更好吗?
    • @ShihabShahriarKhan 根据 numpy.delete 文档,“通常最好使用布尔掩码 ... [它] 等效于 np.delete(...),但允许进一步使用面具。”
    【解决方案3】:

    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])
    

    【讨论】:

    • 这具有可用于分配的优点。不过,想知道是否没有更有效的方法......
    【解决方案4】:

    您还可以对索引使用列表推导

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

    【讨论】:

      猜你喜欢
      • 2020-02-08
      • 2018-10-19
      • 2013-03-23
      • 2013-08-07
      • 2023-04-05
      • 1970-01-01
      • 2014-03-18
      • 2019-01-11
      • 1970-01-01
      相关资源
      最近更新 更多