странное поведение со списком и ndindex - PullRequest
0 голосов
/ 26 февраля 2020

Я надеюсь, что это не является лишним с другим вопросом, но я хотел бы понять следующий результат, который я получаю при выполнении на ноутбуке Jupyter:

f=np.zeros((2,5,7))
l = np.ndindex(f.shape)
count=0
for i in l:
    count+=1
print(count)
la = l
list(la)
count=0
for i in l:
    count+=1
print(count)

70
0

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

согласно документации по ndindex

N-мерный объект итератора для индексирования массивов.

Возвращает объект итератора. Так что l имеет объект-интегратор. Затем вы перебираете все элементы в итераторе, и, по сути, итератор пуст.

Затем вы делаете la копию l, поэтому la теперь имеет тот же объект итератора, что и в l. но l уже повторил его, поэтому в нем больше ничего не осталось.

Таким образом, когда вы пытаетесь выполнить итерацию по la, вы не набираете go в l oop, потому что в итераторе не осталось элементов. Вы можете увидеть то же поведение, если просто попытаетесь выполнить итерации по l дважды

2 голосов
/ 26 февраля 2020

nd.ndindex() возвращает итератор, который может быть повторен только один раз.

1 голос
/ 26 февраля 2020

Вы получаете объект итератора, похожий на <numpy.ndindex at 0x7facbb730950>.

Как описано в dics - .ndindex() returns : An N-dimensional iterator object to index arrays.

Первоначально указатель установлен на 0th index и для доступа к следующему элемент __next__() вызывается на итераторе.

Теперь вы итерируете объект в первом l oop, который вызывает __next__(), устанавливая указатель текущего индекса на последний индекс итератора.

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

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

...