在with语句中使用numpy nditer时出现AttributeError:__ enter__

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在with语句中使用numpy nditer时出现AttributeError:__ enter__相关的知识,希望对你有一定的参考价值。

我试图迭代一个numpy数组并更改其中的一些值。这是我的代码,它从文档(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__

我做错了什么,或者文档中是否有错误(nditerwith中的使用是否被弃用)?

答案

您正在查看Numpy 1.15的文档,并使用new feature of nditer() introduced in that release

在某些条件下,必须在上下文管理器中使用nditer

当使用带有numpy.nditer"writeonly"标志的"readwrite"时,有些情况下nditer实际上并没有给你一个可写数组的视图。相反,它会为您提供一个副本,如果您对副本进行了更改,nditer稍后会将这些更改写回您的实际数组中。目前,这种回写发生在数组对象被垃圾收集时,这使得这个API在CPython上容易出错并且在PyPy上完全被破坏。因此,nditer现在应该用作上下文管理器,只要它与可写数组一起使用,例如with np.nditer(...) as it: ...。对于上下文管理器不可用的情况,例如在生成器表达式中,您也可以显式调用it.close()

该错误表明您有早期版本的Numpy; with语句仅适用于*上下文管理器,其中must implement __exit__ (and __enter__)AttributeError异常表示在您的Numpy版本中,所需的实现不存在。

升级,或不使用with

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

使用CPython时,您可能仍会遇到导致1.15版本发生更改的问题。使用PyPy时,您将遇到这些问题,升级是您唯一适当的追索权。

你可能想参考1.14 version of the same documentation entry you used(或者更具体地说,确保pick the right documentation for your local version

以上是关于在with语句中使用numpy nditer时出现AttributeError:__ enter__的主要内容,如果未能解决你的问题,请参考以下文章

NumPy 多维数组迭代是如何工作的? (有和没有 nditer)

NumPy迭代数组

使用 numpy 时出现“找不到合适的图像”错误

Numpy 迭代数组

Numpy | 11 迭代数组

导入 numpy 模块时出现 Python 错误 [重复]