Удалить все числа из массива, которые находятся в другом массиве - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть массив «съемный», содержащий несколько чисел из другого массива «Все», содержащий все числа от 0 до к.

Я хочу удалить все числа в A, которые перечислены в съемном.

All = np.arange(k)
removable = np.ndarray([1, 3, 4 , 7, 9, ..., 200])

for i in removable:
    if i in All:
        All.remove(i)

У ndarray нет атрибута remove, но я уверен, что в numpy есть простой метод для решения этой проблемы, но я не могу найти его в документальном фильме.

Ответы [ 5 ]

0 голосов
/ 05 февраля 2019

np.setdiff1d() приведет к дублированию исходных записей, а также вернет отсортированный результат.

В некоторых случаях это нормально, но если вы хотите избежать одного или обоих этих аспектов, посмотритев np.in1d() с (инвертированной) логической маской:

>>> a = np.array([1, 2, 3, 2, 4, 1])                                                                                                                                                                                                                    
>>> b = np.array([3, 4, 5, 6])                                                                                                                                                                                                                          
>>> a[~np.in1d(a, b)]                                                                                                                                                                                                                                   
array([1, 2, 2, 1])

Оператор ~ делает инверсию в логической маске:

>>> np.in1d(a, b)                                                                                                                                                                                                                                       
array([False, False,  True, False,  True, False])

>>> ~np.in1d(a, b)                                                                                                                                                                                                                                      
array([ True,  True, False,  True, False,  True])

Отказ от ответственности:

Обратите внимание, что это не удаление , как вы указали в своем вопросе;В результате получается представление в отфильтрованных элементах исходного массива a.То же самое касается np.delete();отсутствует концепция удаления элементов на месте для массивов NumPy.

0 голосов
/ 05 февраля 2019

Решение - быстро для больших массивов, нет необходимости преобразовывать в список (замедление вычислений)

orig=np.arange(15)
to_remove=np.array([1,2,3,4])
mask = np.isin(orig, to_remove)
orig=orig[np.invert(mask)]

>>> orig
array([ 0,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
0 голосов
/ 05 февраля 2019

numpy массивы имеют фиксированную форму, вы не можете удалять элементы из них.

Вы не можете делать это с ndarrays.

0 голосов
/ 05 февраля 2019

Вы должны сделать это с наборами вместо списков / массивов, что достаточно просто:

remaining = np.array(set(arr).difference(removable))

, где arr - это ваш массив All выше ("all" - ключевое слово и не должноперезаписать).

Конечно, использование множеств избавит от повторяющихся элементов, если они есть в вашем arr, но, похоже, arr - это просто последовательность уникальных значений.Наборы имеют гораздо более эффективную проверку членства (постоянное время по сравнению с порядком N), так что вы можете идти намного быстрее.Для сравнения я сделал версию списка, которая создает список, если значение равно , а не в removable:

def remove_list(arr, rem):
    result = []
    for i in arr:
        if i not in rem:
            result.append(i)
    return result

, и сделал мою версию набора функцией также:

def remove_set(arr, rem):
    return np.array(set(arr).difference(rem))

Сравнение времени с arr = np.arange(10000) и removable = np.random.randint(0, 10000, 1000):

remove_list(arr, removable)
# 55.5 ms ± 664 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

remove_set(arr, removable)
# 947 µs ± 3.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

Устанавливается в 50 раз быстрее.

0 голосов
/ 05 февраля 2019

Вы можете использовать функцию setdiff1d из NumPy:

>>> a = np.array([1, 2, 3, 2, 4, 1])
>>> b = np.array([3, 4, 5, 6])
>>> np.setdiff1d(a, b)
array([1, 2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...