https://github.com/numpy/numpy/blob/ffcf508951f646c2ae02c2a0583b884f7a9163e8/numpy/core/src/multiarray/arrayobject.c#L1700-L1702
在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);
}