【问题标题】:How to delete an object from a numpy array without knowing the index如何在不知道索引的情况下从 numpy 数组中删除对象
【发布时间】:2016-07-21 19:55:57
【问题描述】:

是否可以在不知道对象索引但知道对象本身的情况下从 numpy 数组中删除对象?

我已经看到可以使用 np.delete 函数使用对象的索引,但我正在寻找一种方法来使用对象而不是它的索引。

例子:

[a,b,c,d,e,f]

x = e

我想删除x

【问题讨论】:

    标签: python list numpy


    【解决方案1】:

    您可以使用np.argwhere 查找对象的索引/索引,然后使用np.delete 删除对象。

    例子:

    x = np.array([1,2,3,4,5])
    index = np.argwhere(x==3)
    y = np.delete(x, index)
    print(x, y)
    

    【讨论】:

    • 最近将它应用到一个 pandas 日期框架中,我需要一个组中所有唯一字符串的列表,但随后需要从该列表中删除空格('')。这帮助我整理了一个优雅的解决方案------->b['A'] = b['A'].apply(lambda x: np.delete(x,np.argwhere(x=='')))
    【解决方案2】:

    将其转换为 numpy 数组,并将其屏蔽

    x = np.array(list("abcdef"))
    
    x = x[x!='e']  # <-- THIS IS THE METHOD
    
    print x
    # array(['a', 'b', 'c', 'd', 'f'])
    

    不必比这更复杂。

    【讨论】:

    • 这实际上并没有解决删除值的问题。
    • 您指的是我实际上并没有将 x[x!='e'] 放回 x 变量吗?
    • 不要“请...”我。这只是一个建议。
    • 我删除了请。这很讽刺,但在阅读了我自己的评论后,我意识到它变得很糟糕。无论如何,这是最简单的答案。
    • 您实际上不能从数组中删除值(作为就地操作)。你总会得到一个新数组。
    【解决方案3】:

    布尔索引或屏蔽是选择或删除数组特定元素的一种很好的基本方法

    您谈论删除特定的“对象”。让我们从字面上理解并定义一个 dtype 对象数组:

    In [2]: x=np.array(['a','b','c','d','e'],dtype=object)
    In [3]: x
    Out[3]: array(['a', 'b', 'c', 'd', 'e'], dtype=object)
    In [4]: x=='d'   # elements that equal 'd'
    Out[4]: array([False, False, False,  True, False], dtype=bool)
    In [5]: x!='d'    # elements that don't
    Out[5]: array([ True,  True,  True, False,  True], dtype=bool)
    In [6]: x[x!='d']   # select a subset
    Out[6]: array(['a', 'b', 'c', 'e'], dtype=object)
    

    argwheredelete 在幕后使用这个。请注意,argwhere 使用 x==d 布尔数组,将其转换为数组索引。而像这样构造掩码是delete 运作的一种方式。

    有一些重要的限制:

    • 相等(或不相等)测试必须适用于您的价值观。如果元素是浮点数,则可能不会。

    • 从一维数组中删除比从二维(或更大)数组中删除更容易。使用 2d,您必须决定是删除行、列还是元素(并在展平数组的过程中)。

    • 只删除匹配的一个元素有点棘手。

    在某些情况下,.tolist() 数组并使用列表方法可能会更好。

    In [32]: xl=x.tolist()
    In [33]: xl.remove('d')
    In [34]: np.array(xl,dtype=object)
    Out[34]: array(['a', 'b', 'c', 'e'], dtype=object)
    

    对于数组,没有与 list.remove 完全等价的方法。

    【讨论】:

      【解决方案4】:

      您可以使用np.setdiff1d(a,b),它会返回 a 中不在 b 中的所有 唯一 元素。

      >>> arr = np.array(['a', 'a', 'b', 'c', 'd', 'e', 'f'])
      >>> to_remove = ['b', 'c']
      >>> np.setdiff1d(arr, to_remove)
      array(['a', 'd', 'e', 'f'], dtype='<U1')
      

      【讨论】:

        【解决方案5】:

        arr = np.array(['a','b','c','d','e','f'])

        然后

        arr = [x for x in arr if arr != 'e']

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-05
          • 1970-01-01
          • 2017-03-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多