AttributeError: __enter__ при использовании numpy nditer внутри оператора with - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь выполнить итерацию по пустому массиву и изменить некоторые значения внутри него. Вот мой код, он буквально скопирован из документации ( numpy nditer docs ):

import numpy as np

a = np.arange(6).reshape(2,3)
print(a)
with np.nditer(a, op_flags=['readwrite']) as it:
  for x in it:
    x[...] = 2 * x

print(a)

Но я продолжаю получать следующую трассировку:

Traceback (most recent call last):
  File "text.py", line 5, in <module>
    with np.nditer(a, op_flags=['readwrite']) as it:
AttributeError: __enter__

Я что-то делаю неправильно, или в документах есть ошибка (использование nditer внутри with устарело)?

1 Ответ

0 голосов
/ 02 сентября 2018

Вы просматриваете документацию для Numpy 1.15, и в ней используется новая функция nditer(), представленная в этом выпуске :

При определенных условиях в контекстном менеджере должен использоваться nditer

При использовании numpy.nditer с флагами "writeonly" или "readwrite" существуют некоторые обстоятельства, когда nditer фактически не дает представление о доступном для записи массиве. Вместо этого он дает вам копию, и если вы вносите изменения в копию, nditer позже записывает эти изменения обратно в ваш фактический массив. В настоящее время эта обратная запись происходит, когда объекты массива собираются мусором, что делает этот API подверженным ошибкам в CPython и полностью не работает в PyPy. Следовательно, nditer теперь должен использоваться как менеджер контекста всякий раз, когда он используется с записываемыми массивами, например, with np.nditer(...) as it: .... Вы также можете явно вызвать it.close() для случаев, когда менеджер контекста не работает, например, в выражениях генератора.

Ошибка указывает, что у вас есть более ранняя версия Numpy; оператор with работает только с * диспетчерами контекста, которые должны реализовывать __exit____enter__) , а исключение AttributeError указывает, что в вашей версии Numpy требуемая реализация отсутствует ,

Либо обновите, либо не используйте with:

for x in np.nditer(a, op_flags=['readwrite']):
    x[...] = 2 * x

При использовании CPython вы можете по-прежнему сталкиваться с проблемами, вызвавшими изменения, внесенные в выпуск 1.15. При использовании PyPy вы будете сталкиваться с этими проблемами, и обновление - ваш единственный правильный выход.

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

...