私はPython C-Apiの仕組みを理解しようとしており、PythonとC Extensionの間でnumpy配列を交換したいと考えています。Numpy C-Apiの例はSegFaultを与えます
だから、私はこのチュートリアルを開始しました:http://dsnra.jpl.nasa.gov/software/Python/numpydoc/numpy-13.html
が最初の例を実行しようとしました、2D numpyの配列のトレースを計算Cモジュール、私は基本演算をしたいから、私にとって非常にきれいでした2d配列でも同様です。
#include <Python.h>
#include "Numeric/arrayobject.h"
#include<stdio.h>
int main(){
Py_Initialize();
import_array();
}
static char doc[] =
"This is the C extension for xor_masking routine";
static PyObject *
trace(PyObject *self, PyObject *args)
{
PyObject *input;
PyArrayObject *array;
double sum;
int i, n;
if (!PyArg_ParseTuple(args, "O", &input))
return NULL;
array = (PyArrayObject *)
PyArray_ContiguousFromObject(input, PyArray_DOUBLE, 2, 2);
if (array == NULL)
return NULL;
n = array->dimensions[0];
if (n > array->dimensions[1])
n = array->dimensions[1];
sum = 0.;
for (i = 0; i < n; i++)
sum += *(double *)(array->data + i*array->strides[0] + i*array->strides[1]);
Py_DECREF(array);
return PyFloat_FromDouble(sum);
}
static PyMethodDef TraceMethods[] = {
{"trace", trace, METH_VARARGS, doc},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
inittrace(void)
{
(void) Py_InitModule("trace", TraceMethods);
}
}
モジュールの名前は、トレースであり、それはsetup.pyファイルにコンパイルされます。ファイルがコンパイルされ
from distutils.core import setup, Extension
module = Extension('trace', sources = ['xor_masking.cpp'])
setup(name = 'Trace Test', version = '1.0', ext_modules = [module])
、IPythonでtrace.soインポートされますが、私は使用しようとすると、メソッドtrace()は、Segmentation Faultを取得しますが、理由はわかりません。私はFedoraの15、Pythonの2.7.1、GCC 4.3.0でこれを実行
、numpyの1.5.1モジュールのためのあなたのinit関数を呼び出す必要がある
次のチュートリアルは、現在のNumpyによって置き換えられた* Numeric *のライブラリです。 Numpyはほとんど*後方互換性がありますが、完全ではありません。 (はい、また* Numeric *は非公式に "Numpy"と呼ばれ、混乱を招く...) –
'#include" Numpy/arrayobject.h' 代わりに –