首页 > 解决方案 > 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) 

这种行为的原因是什么?

标签: numpy

解决方案


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

要对其进行迭代,请创建您的数组,例如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);
}

推荐阅读