Как удалить объект из массива numpy, не зная индекса

можно ли удалить объект из массива numpy, не зная индекс объекта, но вместо этого зная сам объект?

Я видел, что можно использовать индекс объекта, используя np.удалить функцию, но я ищу способ сделать это, имея объект, но не его индекс

пример:

[a,b,c,d,e, f]

x = e

Я хотел бы удалить x

thx в заранее

3 ответов


вы можете найти индекс / индексы объекта, используя np.argwhere, а затем удалить объект(ы) с помощью np.удалить.

пример:

x = np.array([1,2,3,4,5])
index = np.argwhere(x==3)
y = np.delete(x, index)
print(x, y)

приведите его как массив numpy, и есть очень простой способ:

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

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

print x
# array(['a', 'b', 'c', 'd', 'f'])

не должно быть сложнее, чем это.


логическое индексирование или маскирование-хороший базовый способ выбора или удаления определенных элементов массива

вы говорите об удалении определенного "объекта". Давайте возьмем это буквально и определим массив объекта 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)

за кулисами argwhere и delete использовать это. Обратите внимание, что argwhere использует x==d логический массив, преобразующий его в индексы массива. И построение маски, как это один из способов, что delete работает.

там некоторые важные ограничения:

  • этот тест равенства (или не равенства) должен работать для ваших ценностей. А может, и нет, если элементы-это поплавки.

  • удаление из массива 1d проще, чем из 2d (или большего). С 2d вы должны решить, удалять ли строку, столбец или элемент (и в процессе выравнивания массива).

  • удаление только одного элемента из этих совпадений немного похитрее.

в некоторых случаях может быть лучше .tolist() массив и используйте метод list.

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)

нет точного эквивалента в list.remove для массивов.