numpy从列表列表中删除列表元素

时间:2016-10-31 18:27:17

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

我有一系列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吗?

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分:1)

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获得全面的解决方案:

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

答案 2 :(得分:1)

您是否尝试过列表删除?

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,您需要先找到所需行的索引。使用整数数组并不太难。随着花车,它更棘手。

======

但你不需要使用delete在numpy中执行此操作;布尔索引工作原理:

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可用于将布尔值(或其反转)转换为指标。有时这很方便,但通常不需要。