hasattr(np.array(1), '__iter__') 为 True,但在循环遍历 np.array(1) 时抛出 TypeError



在Numpy 1.21.1版本上,

import numpy as np
arr = np.array(1)
hasattr(arr, '__iter__') # Returns True
for i in arr: # Throws TypeError: iteration over a 0-d array
print(i) 

这种行为的原因是什么?

这不起作用,因为数组没有任何可迭代的维度(它只有一个值)

要遍历它,创建像np.array([1])

这样的数组
>>> np.array(1).shape
()
>>> iter(np.array(1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: iteration over a 0-d array
>>> np.array([1]).shape
(1,)
>>> iter(np.array([1]))
<iterator object at 0xabcd000>

虽然numpy.array的实例有__iter__方法,但它们内部会直接检查它们是否为0维,并在尝试迭代时抛出TypeError !


https://github.com/numpy/numpy/blob/ffcf508951f646c2ae02c2a0583b884f7a9163e8/numpy/core/src/multiarray/arrayobject.c#L1700-L1702
static PyObject *
array_iter(PyArrayObject *arr)
{
if (PyArray_NDIM(arr) == 0) {
PyErr_SetString(PyExc_TypeError,
"iteration over a 0-d array");
return NULL;
}
return PySeqIter_New((PyObject *)arr);
}

最新更新