Вы не можете изменить длину массива numpy, потому что numpy назначает необходимую память для массива при его создании.
С
array = np.delete(array, idx+1)
Вы создаете новый массив насправа от =
и переназначить имя array
.
Возвращаемое значение для enumerate(np.nditer(array))
уже создано в этой точке и не распознает, что имя array
было восстановлено.
В принципе, вы можете перебирать последовательностьи одновременно изменять его длину (как правило, не очень хорошая идея). У объекта просто должны быть методы, позволяющие изменять его длину (например, списки).
Обратите внимание:
>>> l = [5, 4, 3, 2, 1]
>>> for idx, ele in enumerate(l):
...: if ele == 3:
...: l.pop(idx) # mutates l
...: print(ele)
...:
5
4
3
1
>>> l
[5, 4, 2, 1]
Обратите внимание, что
l
видоизменен. - Цикл не печатает
2
, поскольку выталкивание элемента уменьшает индексы всех оставшихся элементов на единицу. Теперь l[2] == 2
, но индекс 2
уже посещен итератором, поэтому следующий вызов print печатает l[3]
, что равно 1.
Это доказывает, что мутации в l
имеютвлияние на последующие итерации.