Вы должны сделать это с наборами вместо списков / массивов, что достаточно просто:
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 раз быстрее.