2013-05-16 6 views
6

से कुछ नया सीखने के लिए, मैं वर्तमान में cpy में numpy.mean() फ़ंक्शन को पुन: कार्यान्वित करने का प्रयास कर रहा हूं। इसे 3 डी सरणी लेनी चाहिए और 2 डी सरणी को इसके माध्य के साथ वापस लेना चाहिए अक्ष 0 के साथ तत्व। मैं सभी मूल्यों के माध्य की गणना करने का प्रबंधन करता हूं, लेकिन वास्तव में यह नहीं जानता कि मैं पाइथन में एक नई सरणी कैसे वापस करूंगा। मैंने पढ़े स्रोतों से, मुझे लगता है कि इसमें पॉइंटर्स और ऐसे कुछ गंभीर जुगलिंग शामिल हैं, जिन्हें मैं बहुत परिचित नहीं हूं (लेकिन ऐसा करने के लिए तैयार हूं)।सी एक्सटेंशन

मेरे कोड अब तक:

#include <Python.h> 
#include <numpy/arrayobject.h> 

// Actual magic here: 
static PyObject* 
myexts_std(PyObject *self, PyObject *args) 
{ 
    PyArrayObject *input=NULL; 
    int i, j, k, x, y, z, dims[2]; 
    double out = 0.0; 

    if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &input)) 
     return NULL; 

    x = input->dimensions[0]; 
    y = input->dimensions[1]; 
    z = input->dimensions[2]; 

    for(k=0;k<z;k++){ 
     for(j=0;j<y;j++){ 
      for(i=0;i < x; i++){ 
       out += *(double*)(input->data + i*input->strides[0] 
+j*input->strides[1] + k*input->strides[2]); 
      } 
     } 
    } 
    out /= x*y*z; 
    return Py_BuildValue("f", out); 
} 

// Methods table - this defines the interface to python by mapping names to 
// c-functions  
static PyMethodDef myextsMethods[] = { 
    {"std", myexts_std, METH_VARARGS, 
     "Calculate the standard deviation pixelwise."}, 
    {NULL, NULL, 0, NULL} 
}; 

PyMODINIT_FUNC initmyexts(void) 
{ 
    (void) Py_InitModule("myexts", myextsMethods); 
    import_array(); 
} 

मैं अब तक क्या समझ (और मुझे सही करें यदि मैं गलत हूँ) मैं (शायद के साथ एक नया PyArrayObject भी बनाना होगा, जो मेरी उत्पादन होगा PyArray_FromDims?)। फिर मुझे इस सरणी की याद में एड्रेस की एक सरणी चाहिए और इसे डेटा से भरें। मैं इसे किस तरह लूं?

संपादित करें:

संकेत (यहाँ: http://pw1.netcom.com/~tjensen/ptr/pointers.htm) पर कुछ अधिक पढ़ने करने के बाद, मैं हासिल क्या मैं पर निशाना था। अब एक और सवाल उठता है: मुझे numpy.mean() के मूल कार्यान्वयन को कहां मिलेगा? मैं देखना चाहता हूं कि यह कैसा है, कि पाइथन ऑपरेशन मेरे संस्करण से बहुत तेज है। मुझे लगता है कि यह बदसूरत लूपिंग से बचाता है। ;)

static PyObject* 
myexts_std(PyObject *self, PyObject *args) 
{ 
    PyArrayObject *input=NULL, *output=NULL; // will be pointer to actual numpy array ? 
    int i, j, k, x, y, z, dims[2]; // array dimensions ? 
    double *out = NULL; 
    if (!PyArg_ParseTuple(args, "O!", &PyArray_Type, &input)) 
     return NULL; 

    x = input->dimensions[0]; 
    y = dims[0] = input->dimensions[1]; 
    z = dims[1] = input->dimensions[2]; 
    output = PyArray_FromDims(2, dims, PyArray_DOUBLE);  
    for(k=0;k<z;k++){ 
     for(j=0;j<y;j++){ 
      out = output->data + j*output->strides[0] + k*output->strides[1]; 
      *out = 0; 
      for(i=0;i < x; i++){ 
       *out += *(double*)(input->data + i*input->strides[0] +j*input->strides[1] + k*input->strides[2]); 
      } 
      *out /= x; 
     } 
    } 
    return PyArray_Return(output); 
} 
+3

यहाँ numpy के माध्य के लिए स्रोत कोड है: https://github.com/numpy/numpy/blob/3abd8699dc3c71e389356ca6d80a2cb9efa16151/numpy/core/src/multiarray/calculation.c#L744 – SingleNegationElimination

उत्तर

0

Numpy एपीआई पूरा करता है कि आप "बदसूरत पाशन" बिना कार्य करना चाहते हैं क्या एक समारोह PyArray_Mean है:

यहाँ मेरी समाधान है।

संबंधित मुद्दे