2013-05-16 11 views
6

何か新しいことを学ぶために、私は現在Cでnumpy.mean()関数を再実装しようとしています。3D配列を取って、私はすべての値の平均を計算することができますが、新しい配列をPythonにどのように返すか分かりません。私が読んだ情報源からは、ポインタなどの深刻なジャグリングが関係していると思いますが、これはあまりよく知られていませんが、そういうことになります。これまでCの拡張からnumpy配列を返す

私のコードは:私は(私が間違っている場合は、私を修正してください)これまでの理解は何

#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?)。次に、この配列のメモリに一連のアドレスが必要であり、データでそれを埋めます。私はこれについてどうやって行くのですか?

EDIT:

(ここでは:http://pw1.netcom.com/~tjensen/ptr/pointers.htm)のポインタにいくつかのより多くの読み取りを行った後、私は私が目指していたものを達成しました。今度は別の質問が発生します:numpy.mean()の元の実装をどこで見つけることができますか?私はそれがどのように、pythonの操作が私のバージョンよりもはるかに高速であることを見たいと思います。私はそれが醜いループを避けると仮定します。 ;)

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のAPIは、あなたが「醜いループ」せずに何をしようとして実現している機能PyArray_Meanがあります

は、ここに私のソリューションです。ここで

関連する問題