Как я могу удалить некоторые конкретные элементы из массива NumPy? Скажи у меня есть
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
Затем я хочу удалить 3,4,7
из a
. Все, что я знаю, это индекс значений ( index=[2,3,6]
).
Использовать numpy.delete () - возвращает новый массив с удаленными подмассивами вдоль оси
numpy.delete(a, index)
Для вашего конкретного вопроса:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]
new_a = np.delete(a, index)
print(new_a) #Prints `[1, 2, 5, 6, 8, 9]`
Обратите внимание, что numpy.delete()
возвращается новый массив, поскольку скаляры массивов являются неизменяемыми, аналогично строкам в Python, поэтому каждый раз, когда в него вносятся изменения, создается новый объект. То есть, процитировать delete()
документы :
« Копия arr с удаленными элементами, указанными в obj. Обратите внимание, что удаление не происходит на месте ...»
Если код, который я публикую, имеет вывод, это результат выполнения кода.
Существует встроенная функция NumPy, чтобы помочь с этим.
источник
np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
Массив Numpy является неизменным , то есть технически вы не можете удалить из него элемент. Однако вы можете создать новый массив без ненужных значений, например так:
источник
a[0]=1
изменяетa
на месте. Но они не могут быть изменены.Чтобы удалить по значению:
источник
Не будучи наглым человеком, я сделал снимок:
Согласно моим тестам, это превосходит
numpy.delete()
. Я не знаю, почему это так, может быть из-за небольшого размера исходного массива?Это довольно существенная разница (в направлении, противоположном тому, что я ожидал), у кого-нибудь есть идеи, почему это так?
Еще более странно, что передача
numpy.delete()
списка работает хуже, чем цикл по списку и присвоение ему одного индекса.Редактировать: Похоже, это связано с размером массива. С большими массивами,
numpy.delete()
значительно быстрее.Очевидно, что все это не имеет значения, так как вы всегда должны идти на ясность и избегать повторного изобретения колеса, но я нашел его немного интересным, поэтому я решил оставить его здесь.
источник
a = delte_stuff(a)
первая итерация, котораяa
уменьшается с каждой итерацией. Когда вы используете встроенную функцию, вы не сохраняете значение обратно в a, которое сохраняет исходный размер! Кроме того, вы можете резко ускорить свою функцию, когда создаете набор функцийindex
и проверяете, удалять или нет элемент. Исправляя обе вещи, я получаю за 10 тыс. Элементов: 6,22 мсек за цикл с вашей функцией, 4,48 мсекnumpy.delete
, что примерно соответствует ожидаемому.np.array(list(range(x)))
использованияnp.arange(x)
и для создания индекса вы можете использоватьnp.s_[::2]
.Если вы не знаете индекс, вы не можете использовать
logical_and
источник
Использование
np.delete
- самый быстрый способ сделать это, если мы знаем индексы элементов, которые мы хотим удалить. Однако для полноты позвольте мне добавить еще один способ «удаления» элементов массива с помощью логической маски, созданной с помощьюnp.isin
. Этот метод позволяет нам удалить элементы, указав их напрямую или по их индексам:Удалить по показателям :
Удалить по элементам (не забудьте заново создать оригинал,
a
поскольку он был переписан в предыдущей строке):источник
Удалить конкретный индекс (я удалил 16 и 21 из матрицы)
Вывод:
источник
Вы также можете использовать наборы:
источник