Как перебрать и изменить массив? - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть массив, который я хотел бы перебрать и изменить сам массив с помощью вставок или удалений.

for idx, ele in enumerate(np.nditer(array)):
  if idx + 1 < array.shape[0] and ele > array[idx+1]:
    array = np.delete(array, idx+1)
  print(ele)

Учитывая [5, 4, 3, 2, 1] Я хочу циклраспечатать 5 3 1, потому что 4 и 2 меньше, чем их предыдущие элементы. Но поскольку python создает итератор на основе первого экземпляра array, он печатает 5 4 3 2 1. Я хочу знать, могу ли я получить

Вообще говоря, я хочу изменить итератор, если я изменяюмассив внутри тела моего цикла.

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Вы не можете изменить длину массива 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]

Обратите внимание, что

  1. l видоизменен.
  2. Цикл не печатает 2, поскольку выталкивание элемента уменьшает индексы всех оставшихся элементов на единицу. Теперь l[2] == 2, но индекс 2 уже посещен итератором, поэтому следующий вызов print печатает l[3], что равно 1.

Это доказывает, что мутации в l имеютвлияние на последующие итерации.

0 голосов
/ 03 ноября 2019

Вместо циклического перемещения по массиву вы можете использовать метод где , чтобы найти индексы элементов, удовлетворяющих некоторому условию.

Затем удалить выбранный элемент (илиэлементы), вы можете использовать метод delete , передав исходный массив и список индексов. Затем сохраните результат, например, под той же переменной.

Чтобы добавить элемент, вы можете использовать методы append или insert (для получения подробной информации). см. документацию Numpy ).

Я также нашел сообщение SO о том, как зацикливаться и удалять массив. См. Удаление элементов из массива с итерациями

...