1

これは些細な質問ですが、初心者にはわかりませんでした。

numpy 配列を使用した次の Python C 拡張があります。

#include <cmath>
#include <Python.h>
#include <iostream>
#include "numpy/arrayobject.h"

using namespace std;
PyObject *func_calc(PyObject *self, PyObject *args)
{
    PyObject * PO_clmn;
    PyArrayObject * py_clmn;
    if (!PyArg_ParseTuple(args, "O", &PO_clmn))
        return NULL;
    py_clmn = (PyArrayObject*)PyArray_ContiguousFromObject(PO_clmn,PyArray_DOUBLE,1,1);
    double *clmn = (double*)(py_clmn->data);

    int i;
    int N = py_clmn->dimensions[0];
    int flag_threadholds[N_threadholds];
    for (i=0; i<N; i++)
    {
        clmn[i]=1;
    }
    return Py_None;
}

static PyMethodDef exampleMethods[] = 
{
    { "calc", func_calc, METH_VARARGS },
    { NULL, NULL }
} ;

PyMODINIT_FUNC initcalc()
{
    import_array();
    Py_InitModule("calc", exampleMethods);
}

共有ライブラリとしてコンパイルした後、次の呼び出しで要素 clmn 配列を「1」に変更できないことがわかりました。

import numpy
from calc import calc
clmn=numpy.zeros(10)
calc(clmn)
print clmn #[0,0...

前もって感謝します!

4

1 に答える 1

1

渡すデータに応じて、 への呼び出しでPyArray_ContiguousFromObject元のオブジェクトが返される場合と、オブジェクトのコピーが返される場合があります。コピーが返された場合、コードは元のオブジェクトではなく、そのコピーを変更しています。

于 2012-05-02T08:08:54.370 に答える