【问题标题】:numpy delete list element from list of listsnumpy 从列表列表中删除列表元素
【发布时间】:2016-10-31 18:27:17
【问题描述】:

我有一个 numpy 数组:

a = [[1, 2, 3, 4], [1, 2, 3, 5], [2, 5, 4, 3], [5, 2, 3, 1]]

我需要从a 中查找并删除特定列表:

rem = [1,2,3,5]

numpy.delete(a,rem) 不会返回正确的结果。我需要能够返回:

[[1, 2, 3, 4], [2, 5, 4, 3], [5, 2, 3, 1]]

用 numpy 可以吗?

【问题讨论】:

  • 那么,删除所有与rem相同的行?
  • 你确实需要清楚你有列表还是数组,你有多维数组还是数组的数组。

标签: python arrays list python-3.x numpy


【解决方案1】:

列表推导可以实现这一点。

rem = [1,2,3,5]
a = [[1, 2, 3, 4], [1, 2, 3, 5], [2, 5, 4, 3], [5, 2, 3, 1]]
a = [x for x in a if x != rem]

输出

[[1, 2, 3, 4], [2, 5, 4, 3], [5, 2, 3, 1]]

【讨论】:

    【解决方案2】:

    Numpy 数组不支持按元素随机删除。类似于 Python 中的字符串,需要生成一个新数组来删除单个或多个子元素。

    给定:

    >>> a
    array([[1, 2, 3, 4],
           [1, 2, 3, 5],
           [2, 5, 4, 3],
           [5, 2, 3, 1]])
    >>> rem
    array([1, 2, 3, 5])
    

    您可以获取每个匹配的子数组并从中创建一个新数组:

    >>> a=np.array([sa for sa in a if not np.all(sa==rem)])
    >>> a
    array([[1, 2, 3, 4],
           [2, 5, 4, 3],
           [5, 2, 3, 1]])
    

    要使用np.delete,您将使用索引而不是匹配,因此:

    >>> a
    array([[1, 2, 3, 4],
           [1, 2, 3, 5],
           [2, 5, 4, 3],
           [5, 2, 3, 1]])
    >>> np.delete(a, 1, 0)   # delete element 1, axis 0
    array([[1, 2, 3, 4],
           [2, 5, 4, 3],
           [5, 2, 3, 1]])
    

    但是你不能遍历数组并删除元素...

    可以将多个元素传递给np.delete,但是您只需要匹配子元素:

    >>> a
    array([[1, 2, 3, 5],
           [1, 2, 3, 5],
           [2, 5, 4, 3],
           [5, 2, 3, 1]])
    >>> np.delete(a, [i for i, sa in enumerate(a) if np.all(sa==rem)], 0)
    array([[2, 5, 4, 3],
           [5, 2, 3, 1]])
    

    鉴于相同的 a,您可以使用 np.where 获得一个全 numpy 解决方案:

    >>> np.delete(a, np.where((a == rem).all(axis=1)), 0)
    array([[2, 5, 4, 3],
           [5, 2, 3, 1]])
    

    【讨论】:

      【解决方案3】:

      你试过删除列表吗?

      In [84]: a = [[1, 2, 3, 4], [1, 2, 3, 5], [2, 5, 4, 3], [5, 2, 3, 1]]
      In [85]: a
      Out[85]: [[1, 2, 3, 4], [1, 2, 3, 5], [2, 5, 4, 3], [5, 2, 3, 1]]
      In [86]: rem = [1,2,3,5]
      In [87]: a.remove(rem)
      In [88]: a
      Out[88]: [[1, 2, 3, 4], [2, 5, 4, 3], [5, 2, 3, 1]]
      

      remove 匹配值。

      np.delete 使用索引,而不是值。它还返回一个副本;它没有采取适当的行动。结果是一个数组,而不是嵌套列表(np.delete 将输入转换为数组,然后再对其进行操作)。

      In [92]: a = [[1, 2, 3, 4], [1, 2, 3, 5], [2, 5, 4, 3], [5, 2, 3, 1]]
      In [93]: a1=np.delete(a,1, axis=0)
      In [94]: a1
      Out[94]: 
      array([[1, 2, 3, 4],
             [2, 5, 4, 3],
             [5, 2, 3, 1]])
      

      这更像是列表pop

      In [96]: a = [[1, 2, 3, 4], [1, 2, 3, 5], [2, 5, 4, 3], [5, 2, 3, 1]]
      In [97]: a.pop(1)
      Out[97]: [1, 2, 3, 5]
      In [98]: a
      Out[98]: [[1, 2, 3, 4], [2, 5, 4, 3], [5, 2, 3, 1]]
      

      delete 按值,您需要首先找到所需行的索引。使用整数数组并不难。使用浮点数会更棘手。

      =========

      但你不需要在 numpy 中使用delete 来执行此操作;布尔索引有效:

      In [119]: a = [[1, 2, 3, 4], [1, 2, 3, 5], [2, 5, 4, 3], [5, 2, 3, 1]]
      In [120]: A = np.array(a)     # got to work with array, not list
      In [121]: rem=np.array([1,2,3,5])
      

      简单对比; rem 被广播以匹配行

      In [122]: A==rem
      Out[122]: 
      array([[ True,  True,  True, False],
             [ True,  True,  True,  True],
             [False, False, False, False],
             [False,  True,  True, False]], dtype=bool)
      

      找到所有元素匹配的行 - 这是我们要删除的行

      In [123]: (A==rem).all(axis=1)
      Out[123]: array([False,  True, False, False], dtype=bool)
      

      只需not 它,并用它来索引A

      In [124]: A[~(A==rem).all(axis=1),:]
      Out[124]: 
      array([[1, 2, 3, 4],
             [2, 5, 4, 3],
             [5, 2, 3, 1]])
      

      (原A不变)。

      np.where 可用于将布尔值(或其倒数)转换为索引。有时这很方便,但通常不是必需的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-19
        • 2013-11-25
        • 2018-09-04
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多