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