देता है मैं समझने की कोशिश कर रहा हूं कि पाइथन सी-एपी कैसे काम करता है, और मैं पाइथन और सी एक्सटेंशन के बीच numpy arrays का आदान-प्रदान करना चाहता हूं।न्यूम्पी सी-एपी उदाहरण एक सेगफॉल्ट
तो, मैं इस ट्यूटोरियल शुरू किया: http://dsnra.jpl.nasa.gov/software/Python/numpydoc/numpy-13.html
पहला उदाहरण वहाँ एक सी मॉड्यूल है कि एक 2d numpy सरणी का पता लगाने की गणना करता है ऐसा करने के लिए, की कोशिश की, मेरे लिए बहुत साफ था, के बाद से मैं प्राथमिक संचालन करना चाहते हैं 2 डी सरणी में भी।
#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])
फ़ाइल संकलित किया गया है, trace.so IPython में आयात किया जाता है, लेकिन जब मैं इस्तेमाल करने की कोशिश विधि ट्रेस(), मुझे एक सेगमेंटेशन फॉल्ट मिलता है, मुझे नहीं पता क्यों।
मैं फेडोरा 15, पायथन 2.7.1, जीसीसी 4.3.0 के साथ इस चलाने के लिए, Numpy 1.5.1
ध्यान दें कि आपके द्वारा अनुसरण किए जाने वाले ट्यूटोरियल * न्यूमेरिक * के लिए है, पुरानी लाइब्रेरी वर्तमान नम्पी द्वारा अधिग्रहण की गई है। बेवकूफ * ज्यादातर * इसके पीछे पिछड़ा संगत है, लेकिन पूरी तरह से नहीं। (हां, भी * संख्यात्मक * को अनौपचारिक रूप से "नम्पी" कहा जाता था, जो भ्रम की ओर जाता है ...) –
फिर, क्या मुझे 'शामिल करना चाहिए" Numpy/arrayobject.h' इसके बजाय? –