1. ホーム
  2. python

[解決済み] numpy: "array_like "オブジェクトの正式な定義?

2023-06-16 14:33:27

質問

numpyでは、多くのオブジェクトのコンストラクタは、最初の引数として"array_like"を受け取ります。そのようなオブジェクトの定義、抽象的なメタクラス、または含まれるべきメソッドのドキュメントはありますか?

どのように解決するのですか?

ほとんどのものが技術的に配列のようなものであることがわかりました。 "Array-like"は、入力が何であるかの制限というより、どのように解釈されるかの記述です。もしパラメータが配列のようだと文書化されていれば、NumPyがそれを配列として解釈しようとします。

を超える配列のようなものの正式な定義はありません。 ほぼ同語反復的なものである -- 配列のようなものとは、以下のような Python オブジェクトのことです。 np.array に変換することができます。 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 */

}

つまり、ソースコードを調査することで、配列のようなものは