当前位置: 首页 > 面试题库 >

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

阳文轩
2023-03-14
问题内容

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


问题答案:

事实证明,几乎所有东西在技术上都类似于数组。“类数组”更多地是关于如何解释输入的说明,而不是对输入内容的限制。如果参数记录为类似数组的形式,则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 */

}

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

  • 一个NumPy数组,或者
  • 一个NumPy的标量,或
  • Python标量,或者
  • 任何支持PEP 3118缓冲区接口的对象,或者
  • 任何支持__array_struct__or__array_interface__接口的对象,或者
  • 提供__array__功能的任何对象,或者
  • 可以视为列表列表的任何对象,或者
  • 什么!如果它不属于其他情况之一,它将被视为objectdtype的0维数组。


 类似资料:
  • 本小节将详述如何创建 ndarray 对象,以及如何创建特殊的 ndarray 对象。 1. ndarray 对象 ndarray,也就是我们常用的 N 维数组对象,是 Numpy 最核心的组成部分。你可以把它视为一个快速而灵活的大数据集容器,利用这种数组你可以便捷地执行一些数学运算。 ndarray 有两个显著特点: ndarray 是一个通用的同构数据多维容器,也就是说,该容器中的每一个元素都

  • 主要内容:创建ndarray对象,ndim查看数组维数,reshape数组变维NumPy 定义了一个 n 维数组对象,简称 ndarray 对象,它是一个一系列相同类型元素组成的数组集合。数组中的每个元素都占有大小相同的内存块,您可以使用索引或切片的方式获取数组中的每个元素。 ndarray 对象有一个 dtype 属性,该属性用来描述元素的数据类型,相关知识会在《NumPy数据类型》一节做详细介绍 。 ndarray 对象采用了数组的索引机制,将数组中的每个元素映射到内存

  • 我为用户使用了两种模式。一个包含密码/salt,一个不包含用于返回前端的密码/salt。当我使用使用不带密码的模式的模型时,它仍然返回密码:/ 通用用户(用于发送到客户端) 验证用户(用于创建/更新/验证用户) 创建模型 var modelInstance=mongoose。模型(“authUser”,authUserSchema,“users”) (在不同的文件中) var modelInsta

  • 我的问题是"为什么?:" 这些数组完全相同。 我的最小示例并没有再现这一点: 这个也没有: 我不知道为什么这些不平等。还有一个额外的问题,我如何比较它们? 我需要一种有效的方法来检查aaa是否在堆栈aa中。 我没有在aa中使用

  • 问题内容: 我正在尝试从PHP数组创建JSON对象。该数组如下所示: 编码JSON的代码如下所示: 最后,JSON文件应该看起来像这样: 如何将创建的JSON代码封装在“项目”中:{JSON CODE HERE}。 问题答案: 通常,您将执行以下操作: 但是,似乎您希望输出与“ ”一起使用,因此最好确保通过传递常量来强制将其编码为对象。 “ ”括号指定一个对象,“ ”用于根据JSON规范的数组。

  • 本文向大家介绍javascript工厂方式定义对象,包括了javascript工厂方式定义对象的使用技巧和注意事项,需要的朋友参考一下 每一个函数对象都有一个length属性,表示该函数期望接收的参数个数。 关于js面向对象的创建方式, 目标: 构建一个order对象. 包含三个属性:日期,金额,提交人  包含一个方法:显示字符串:”XX在XXXX-XX-XX 提交了额度为:XXXX元的订单" 一