Как удалить элемент из массива 2D Numpy, не зная его положения

У меня есть 2D-массив: [[0,0], [0,1], [1,0], [1,1]]

Я хочу удалить элемент [0,1], не зная его положения в массиве (поскольку элементы могут быть перемешаны).

Результат должен быть: [[0,0], [1,0], [1,1]]

Я пытался использовать numpy.delete, но продолжаю возвращать сглаженный массив:

>>> arr = np.array([[0,0], [0,1], [1,0], [1,1]])
>>> arr
array([[0, 0],
       [0, 1],
       [1, 0],
       [1, 1]])
>>> np.delete(arr, [0,1])
array([0, 1, 1, 0, 1, 1])

Указание оси удаляет элементы 0, 1, а не ищет элемент (что имеет смысл):

>>> np.delete(arr, [0,1], axis=0)
array([[1, 0],
       [1, 1]])

И попытка найти местоположение (как было предложено) кажется столь же проблематичным:

>>> np.where(arr==[0,1])
(array([0, 1, 1, 3]), array([0, 0, 1, 1]))

(Откуда взялись эти 3?!?)


person Matt    schedule 16.02.2020    source источник
comment
Сначала нужно определить место.   -  person hpaulj    schedule 16.02.2020


Ответы (3)


Здесь мы находим все строки, соответствующие кандидату [0, 1].

>>> (arr == [0, 1]).all(axis=1)
array([False,  True, False, False])

Или же строки, которые не соответствуют кандидату

>>> ~(arr == [0, 1]).all(axis=1)
array([ True, False,  True,  True])

Итак, чтобы выбрать все те строки, которые не соответствуют [0, 1]

>>> arr[~(arr == [0, 1]).all(axis=1)]
array([[0, 0],
       [1, 0],
       [1, 1]])

Обратите внимание, что при этом будет создан новый массив.

person donkopotamus    schedule 16.02.2020

mask = (arr==np.array([0,1])).all(axis=1)
arr1 = arr[~mask,:]

Посмотрите на mask.. Должно быть [False, True,...].

person hpaulj    schedule 16.02.2020

Из документации:

numpy.delete (обр, объект, ось = нет)

ось: целое, необязательно

Ось, вдоль которой следует удалить подмассив, определенный obj. Если ось имеет значение None, obj применяется к сглаженному массиву.

Если вы не укажете ось (т.е. None), она автоматически сгладит ваш массив; нужно просто указать параметр оси, в вашем случае np.delete(arr, [0,1],axis=0)

Однако, как и в примере выше, [0,1] — это список индексов; вы должны указать индексы/местоположение (например, вы можете сделать это с помощью np.where(condition,array))

Вот вам рабочий пример:

    my_array = np.array([[0, 1],
                         [1, 0],
                         [1, 1],
                         [0, 0]])

    row_index, = np.where(np.all(my_array == [0, 1], axis=1))
    my_array = np.delete(my_array, row_index,axis=0)
    print(my_array)

    #Output is below

        [[1 0]
         [1 1]
         [0 0]]
person Timbus Calin    schedule 16.02.2020
comment
Кажется, это удаляет элементы 0 и 1; Я получаю array([[1, 0], [1, 1]]) - person Matt; 16.02.2020
comment
Да, именно так это и работает. К сожалению, вам нужно будет указать индексы. Один из способов — использовать np.where, чтобы получить индексы вашего массива и удалить только эти индексы. - person Timbus Calin; 16.02.2020
comment
Итак, как бы вы использовали np.where, чтобы найти этот единственный элемент? >>> np.where(arr==[0,1]) возвращает (array([0, 1, 1, 3]), array([0, 0, 1, 1])) -- даже не знаю, как туда попала 3. Но я пробовал несколько перестановок этого и ничего не получаю. - person Matt; 16.02.2020
comment
Проблема, с которой вы столкнулись, заключается в том, что np.where() в многомерных массивах возвращает row_indices и column_indices, а не кортеж (x, y), где выполняется условие. Я обновил пример, чтобы вы увидели рабочий пример. - person Timbus Calin; 16.02.2020