2012-04-24 17 views
1

這應該是一個微不足道的問題,但並沒有成爲初學者。如何更改傳遞給python C擴展的numpy數組元素?

我使用以下Python C-extenstion numpy的陣列已:

#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... 

在此先感謝!

回答

1

根據您傳入的數據,對PyArray_ContiguousFromObject的調用可能會返回原始對象,或者它可能會返回對象的副本。如果它返回一個副本,那麼你的代碼正在修改該副本,而不是原始對象。