Как удалить элемент из массива 2D Numpy, не зная его положения - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть двумерный массив: [[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]])

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

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

(Откуда это 3 откуда?!?)

Ответы [ 3 ]

1 голос
/ 16 февраля 2020

Здесь мы находим все строки, которые соответствуют кандидату [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]])

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

1 голос
/ 16 февраля 2020
mask = (arr==np.array([0,1])).all(axis=1)
arr1 = arr[~mask,:]

Посмотрите на mask .. Это должно быть [Ложь, Правда, ...].

0 голосов
/ 16 февраля 2020

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

numpy .delete (arr, obj, axis = None)

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

Ось вдоль для удаления подмассива, определенного 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]]
...