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

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

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

пример:

[а, б, в, г, д, е]

x = e

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

спасибо заранее

Ответ 1

Вы можете найти индекс/индексы объекта с помощью 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)

Ответ 2

Примените его как массив numy и замаскируйте его:

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

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

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

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

Ответ 3

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

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

Существуют некоторые важные ограничения:

  • чтобы проверка равенства (или не равенства) работала для ваших значений. Это может быть не так, если элементы являются float.

  • удаление из массива 1d проще, чем из 2d (или более). С помощью 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)

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

Ответ 4

arr = np.array(['a','b','c','d','e','f'])

затем

arr = [x for x in arr if arr != 'e']