Сначала давайте рассмотрим альтернативы для простого удаления (без этого изменения в вопросе начальной позиции):
Сначала создайте x
с уникальными и легко распознаваемыми значениями:
In [787]: x = list(range(10))
In [788]: x
Out[788]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Метод понимания списка - может быть, не самый быстрый, но довольно понятный и без ошибок:
In [789]: [v for i,v in enumerate(x) if i not in x_remove]
Out[789]: [0, 2, 3, 6, 7, 8, 9]
Ваш np.delete
подход:
In [790]: np.delete(x, x_remove)
Out[790]: array([0, 2, 3, 6, 7, 8, 9])
С обратной стороной преобразования x
к массиву, который не является тривиальной задачей (по времени).Это также делает новый массив.Я думаю, что это медленнее.
Попробуйте вместо удаления:
In [791]: y=x[:]
In [792]: for i in x_remove:
...: del y[i]
...:
In [793]: y
Out[793]: [0, 2, 3, 4, 6, 8, 9]
упс - неправильно.Нам нужно начать с конца (самый большой индекс).Это хорошо известный «рецепт» Python:
In [794]: y=x[:]
In [795]: for i in x_remove[::-1]:
...: del y[i]
...:
...:
In [796]: y
Out[796]: [0, 2, 3, 6, 7, 8, 9]
Под покровами np.delete
использует маскированный подход:
In [797]: arr = np.array(x)
In [798]: arr
Out[798]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [799]: mask = np.ones(arr.shape, bool)
In [800]: mask[x_remove] = False
In [801]: mask
Out[801]:
array([ True, False, True, True, False, False, True, True, True,
True])
In [802]: arr[mask]
Out[802]: array([0, 2, 3, 6, 7, 8, 9])
Теперь к вопросу применения x_remove
на ломтик x
.Срез x
не имеет записи параметров среза.То есть вы не можете легко определить, что в y = x[2:]
отсутствуют два значения.(Ну, я мог бы вывести это, сравнив некоторые атрибуты x
и y
, но не только из y
).
Так что независимо от того, как вы выполняете удаление, вам придется сначала настроитьзначения x_remove
.
In [803]: x2 = np.array(x_remove)-2
In [804]: x2
Out[804]: array([-1, 2, 3])
In [805]: [v for i,v in enumerate(x[2:]) if i not in x2]
Out[805]: [2, 3, 6, 7, 8, 9]
Это работает нормально, но это -1
потенциально является проблемой.Мы не хотим, чтобы это означало the last element
.Поэтому мы должны сначала отфильтровать отрицательные признаки, чтобы быть в безопасности.
In [806]: np.delete(x[2:], x2)
/usr/local/bin/ipython3:1: FutureWarning: in the future negative indices will not be ignored by `numpy.delete`.
#!/usr/bin/python3
Out[806]: array([2, 3, 6, 7, 8, 9])
Если delete
не игнорирует отрицательные индексы, он может получить такую маску - с False
в конце:
In [808]: mask = np.ones(arr[2:].shape, bool)
In [809]: mask[x2] = False
In [810]: mask
Out[810]: array([ True, True, False, False, True, True, True, False])