numpy:“ array_like”对象的正式定义?

发布于 2021-01-29 15:06:04

在numpy中,许多对象的构造函数都将“ array_like”作为第一个参数。是否有此类对象的定义,可以作为抽象元类,还是应包含方法的文档?

关注者
0
被浏览
84
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    事实证明,几乎所有东西在技术上都类似于数组。“类数组”更多地是关于如何解释输入的说明,而不是对输入内容的限制。如果参数记录为类似数组的形式,则NumPy将尝试将其解释为数组。

    除了几乎是重言式的之外没有像数组一样的正式定义-
    像数组一样是np.array可以转换为的任何Python对象ndarray。要做到这一点,您需要研究源代码

    NPY_NO_EXPORT PyObject *
    PyArray_FromAny(PyObject *op, PyArray_Descr *newtype, int min_depth,
                    int max_depth, int flags, PyObject *context)
    {
        /*
         * This is the main code to make a NumPy array from a Python
         * Object.  It is called from many different places.
         */
        PyArrayObject *arr = NULL, *ret;
        PyArray_Descr *dtype = NULL;
        int ndim = 0;
        npy_intp dims[NPY_MAXDIMS];
    
        /* Get either the array or its parameters if it isn't an array */
        if (PyArray_GetArrayParamsFromObject(op, newtype,
                            0, &dtype,
                            &ndim, dims, &arr, context) < 0) {
            Py_XDECREF(newtype);
            return NULL;
        }
        ...
    

    尤其有趣的是PyArray_GetArrayParamsFromObject,其注释列举了np.array期望的对象类型:

    NPY_NO_EXPORT int
    PyArray_GetArrayParamsFromObject(PyObject *op,
                            PyArray_Descr *requested_dtype,
                            npy_bool writeable,
                            PyArray_Descr **out_dtype,
                            int *out_ndim, npy_intp *out_dims,
                            PyArrayObject **out_arr, PyObject *context)
    {
        PyObject *tmp;
    
        /* If op is an array */
    
        /* If op is a NumPy scalar */
    
        /* If op is a Python scalar */
    
        /* If op supports the PEP 3118 buffer interface */
    
        /* If op supports the __array_struct__ or __array_interface__ interface */
    
        /*
         * If op supplies the __array__ function.
         * The documentation says this should produce a copy, so
         * we skip this method if writeable is true, because the intent
         * of writeable is to modify the operand.
         * XXX: If the implementation is wrong, and/or if actual
         *      usage requires this behave differently,
         *      this should be changed!
         */
    
        /* Try to treat op as a list of lists */
    
        /* Anything can be viewed as an object, unless it needs to be writeable */
    
    }
    

    因此,通过研究源代码,我们可以得出类似数组的结论



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看