python-3.x 删除numpy 2d数组中的对象

carvr3hs  于 2023-06-07  发布在  Python
关注(0)|答案(3)|浏览(119)

我只想删除所需的[1,2],但这并没有完成

import numpy as np

arr = np.array([[1,2],[3,4],[5,6],[1,3]])
arr = np.delete(arr, np.where(np.isin(arr, [[1,2]])))

print(arr)

output:array([3,5,6,1,3])
我还使用了setdiff1d方法,但它删除了所有的1和2

uxhixvfz

uxhixvfz1#

也许这个能帮上忙

mask = (arr[:,0] == 1) & (arr[:,1] == 2)
# where first column == 1 and 2nd column == 2
# invert the mask and select all the rows where this is not true
print(arr[~mask])

下面是示例的输出

>>> import numpy as np
>>> arr = np.array([[1,2],[3,4],[5,6],[1,3]])
>>> mask = (arr[:,0] == 1) & (arr[:,1] == 2)
>>> mask
array([ True, False, False, False])
>>> arr[~mask]
array([[3, 4],
       [5, 6],
       [1, 3]])
>>>
mpgws1up

mpgws1up2#

我怀疑你没有花太多时间阅读np.delete文档。您没有指定轴。

In [96]: arr = np.array([[1,2],[3,4],[5,6],[1,3]])

删除第一行很容易:

In [97]: np.delete(arr, 0, axis=0)
Out[97]: 
array([[3, 4],
       [5, 6],
       [1, 3]])

如果没有axis,delete会首先展平数组:

In [98]: np.delete(arr, 0, )
Out[98]: array([2, 3, 4, 5, 6, 1, 3])

通过索引或布尔掩码来删除/选择行也很容易

In [99]: arr[[1,2,3],:]
Out[99]: 
array([[3, 4],
       [5, 6],
       [1, 3]])

这就是delete最终要做的;它将“移除”列表转换为“保持”列表。
问题的另一部分是确定要删除哪些行。也就是说,将值转换为行索引。把这两项任务分开是个好主意。
使用isin

In [100]: np.isin(arr, [[1,2]])
Out[100]: 
array([[ True,  True],
       [False, False],
       [False, False],
       [ True, False]])

这是一个二维布尔数组。应用all

In [101]: np.isin(arr, [[1,2]]).all(axis=0)
Out[101]: array([False, False])

Oops,错误的轴:

In [102]: np.isin(arr, [[1,2]]).all(axis=1)
Out[102]: array([ True, False, False, False])

我们可以使用布尔数组索引行:

In [103]: arr[np.isin(arr, [[1,2]]).all(axis=1),:]
Out[103]: array([[1, 2]])

以及用于移除行:

In [104]: arr[~np.isin(arr, [[1,2]]).all(axis=1),:]
Out[104]: 
array([[3, 4],
       [5, 6],
       [1, 3]])

是的,我们可以使用where将其转换为索引,但这不是必需的。
我鼓励您检查和理解过程中的每一部分,既要识别值,又要删除它们。不要把任何一个你不需要理解的“块框”。

zvokhttg

zvokhttg3#

因此,对于这种特殊情况,我建议使用数组的结构化视图,这允许您将其视为“对象数组”(structs):

>>> import numpy as np
>>> arr = np.array([[1,2],[3,4],[5,6],[1,3]])
>>> structured = arr.ravel().view("i8, i8")
>>> structured
array([(1, 2), (3, 4), (5, 6), (1, 3)],
      dtype=[('f0', '<i8'), ('f1', '<i8')])

然后,您可以简单地执行以下操作:

>>> np.isin(structured, np.array([(1,2)], dtype="i8, i8"))
array([ True, False, False, False])
>>> arr[np.isin(structured, np.array([(1,2)], dtype="i8, i8"))]
array([[1, 2]])
>>> arr[~np.isin(structured, np.array([(1,2)], dtype="i8, i8"))]
array([[3, 4],
       [5, 6],
       [1, 3]])

或者等效地使用np.delete指定正确的轴:

>>> np.delete(arr, np.isin(structured, np.array([(1,2)], dtype="i8, i8")), axis=0)
array([[3, 4],
       [5, 6],
       [1, 3]])

重要的是要注意,你可以添加更多的“项目”来删除琐碎:

>>> np.delete(arr, np.isin(structured, np.array([(1,2), (5,6)], dtype="i8, i8")), axis=0)
array([[3, 4],
       [1, 3]])

只要确保在使用np.array构造函数创建结构化数组时,将listtuple一起使用,以便它理解您希望如何正确解释它们。

相关问题