如何在不知道索引的情况下从numpy数组中删除对象

Mhm*_*nsr 17 python numpy list

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

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

例:

[A,B,C,d,E,F]

x = e

我想删除x

thx提前

joj*_*nas 24

您可以使用对象的索引/指数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)
Run Code Online (Sandbox Code Playgroud)


Ulf*_*lak 14

把它作为一个numpy数组投射,有一个非常简单的方法:

x = np.array(list("abcdef"))

x = x[x!='e']  # <-- THIS IS THE METHOD

print x
# array(['a', 'b', 'c', 'd', 'f'])
Run Code Online (Sandbox Code Playgroud)

不必比这更复杂.

  • 您实际上无法从数组中删除值(作为就地操作)。您将始终获得一个新数组。 (2认同)

hpa*_*ulj 6

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

您谈论删除特定的“对象”。让我们从字面上理解并定义一个 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)
Run Code Online (Sandbox Code Playgroud)

在幕后argwhere,并delete使用它。请注意,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)
Run Code Online (Sandbox Code Playgroud)

没有完全等同于list.removefor 数组。