2015-05-07 9 views
5

चलाने पर पाइथन रनटाइम त्रुटि मैं अपने सी ++ कोड से "टी-टेस्ट" की गणना करने के लिए एक पायथन फ़ंक्शन को कॉल कर रहा हूं।टी-टेस्ट

#include <iostream> 
#include "Python.h" 
#include "/usr/local/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h" 

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION 

int main(int argc, char** argv) 
{ 
    Py_Initialize(); 

    PyRun_SimpleString("import sys"); 
    PyRun_SimpleString("sys.path.append(\"PATH_TO_MOD\")"); 
    PyObject *pName = PyString_FromString("tmpPyth"); 
    PyObject *pModule = PyImport_Import(pName); 


    double arr[] ={9.74219, 10.2226, 8.7469, 8.69791, 9.96442, 9.96472, 9.37913, 9.75004}; 
    double arr1[] ={9.74219, 10.2226, 8.7469, 8.69791, 9.96442, 9.96472, 9.37913, 9.75004}; 

    PyObject *lst = PyList_New(8); 
    PyObject *lst1 = PyList_New(8); 
    // if (!lst) 
    //  return NULL; 
    for (int i = 0; i < 8; i++) { 
     PyObject *num = PyFloat_FromDouble(arr[i]); 
     PyObject *num1 = PyFloat_FromDouble(arr1[i]); 
     PyList_SET_ITEM(lst, i, num); 
     PyList_SET_ITEM(lst1, i, num1); 
    } 

    PyObject *pArgs = PyTuple_New(2); 
    PyTuple_SetItem(pArgs, 0, lst); 
    PyTuple_SetItem(pArgs, 1, lst1); 

    if (pModule != NULL) { 
     PyObject *pFunc = PyObject_GetAttrString(pModule, "blah"); 

     if(pFunc != NULL){ 
      PyObject_CallObject(pFunc, pArgs); 
     } 
    } 
    else 
     std::cout << "Module path provided may be wrong. Module not found.\n\n"; 
    return 0; 
} 

और मेरे अजगर मॉड्यूल इस प्रकार परिभाषित किया गया है:: समारोह कॉल के रूप में निम्नानुसार किया जाता है

import numpy 
import scipy 
import matplotlib 

from scipy import stats 
def blah(baseline, follow_up): 
    paired_sample = stats.ttest_rel(baseline , follow_up) 
    print "The t-statistic is %.3f and the p-value is %.3f." % paired_sample 

अब जब मैं इस चलाने का प्रयास मैं निम्नलिखित क्रम अपवाद:

/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/scipy/stats/stats.py:3458: RuntimeWarning: invalid value encountered in divide 
    t = np.divide(dm, denom) 

लेकिन अगर मैं स्पष्ट रूप से एक सूची परिभाषित करता हूं और "टी-टेस्ट" फ़ंक्शन को निष्पादित करता हूं और निष्पादित करता हूं तो यह ठीक है। चल समारोह परिभाषा इस प्रकार है:

import numpy 
import scipy 
import matplotlib 

from scipy import stats 

    def blah(): 
     baseline = [9.74219, 10.2226, 8.7469, 8.69791, 9.96442, 9.96472, 9.37913, 9.75004] 
     follow_up = [9.94227,9.46763,8.53081,9.43679,9.97695,10.4285,10.159,8.86134] 
     paired_sample = stats.ttest_rel(baseline , follow_up) 
     print "The t-statistic is %.3f and the p-value is %.3f." % paired_sample 

मैं यह सोचते हैं कि मैं सूचियों अजगर स्क्रिप्ट को पास किए जाने को परिभाषित करने में कुछ गलती कर रहा हूं, लेकिन क्या पता नहीं कर सकते हैं। किसी भी सहायता की सराहना की जाएगी।

+3

ऐसा कुछ भी नहीं है जो आपके विवरण को पढ़ने से मुझ पर कूदता है, इसलिए यह ध्वनि दिखता है। जिज्ञासा के लिए, आप 'blah()' कहते हैं और त्रुटि 'numpy.stats() 'में है,' blah()' में आने वाले मान क्या हैं? उनके प्रतिनिधित्व को आउटपुट करने के लिए 'प्रिंट रिप्र (बेसलाइन)' और 'प्रिंट रिप्र (follow_up)' का उपयोग करें। उस ने कहा, तुम अभी भी पाइथन 2 का उपयोग क्यों करते हो? कम से कम वर्तमान पाइथन में बेवकूफ भी उपलब्ध है। –

+0

हम्म, शायद एक बेवकूफ सवाल है, लेकिन क्या आपने पूर्व-मौजूदा [एससीपीई से टी-टेस्ट] का उपयोग करने पर विचार किया था (http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html) उन्हें फिर से लागू करने के बजाय? – mtzl

उत्तर

0

arr1 आपके सी ++ कोड में arr के समान है, इसलिए शून्य से विभाजित है। चूंकि baseline और follow_up आपके पायथन कोड में अलग हैं, इसलिए आपको कोई त्रुटि नहीं मिलती है।

बड़े सरणी के लिए आप उन्हें पाइथन सूचियों के माध्यम से मार्शल नहीं करना चाहते हैं, बल्कि इसके बजाय सीधे अजगर को सरणी भेजना चाहते हैं। मैं यह करने के अपने कोड को संशोधित किया गया है इसके बाद के संस्करण:

-- pyfromc.cc -- 
#include <iostream> 
#include <Python.h> 

int main(int argc, char** argv) 
{ 
    Py_Initialize(); 

    PyRun_SimpleString("import sys; sys.path.append('.')"); 
    // PyRun_SimpleString("print '\\n'.join(sys.path)"); 
    PyObject *pName = PyString_FromString("ttest"); 
    PyObject *pModule = PyImport_Import(pName); 

    double arr[] ={9.74219, 10.2226, 8.7469, 8.69791, 9.96442, 9.96472, 9.37913, 9.75004}; 
    double arr1[] ={9.94227,9.46763,8.53081,9.43679,9.97695,10.4285,10.159,8.86134}; 

    PyObject *pArgs = PyTuple_New(3); 
    PyTuple_SetItem(pArgs, 0, PyLong_FromLong(8)); 
    PyTuple_SetItem(pArgs, 1, PyLong_FromVoidPtr(arr)); 
    PyTuple_SetItem(pArgs, 2, PyLong_FromVoidPtr(arr1)); 

    if (pModule != NULL) { 
     PyObject *pFunc = PyObject_GetAttrString(pModule, "blahptr"); 

     if(pFunc != NULL){ 
      PyObject_CallObject(pFunc, pArgs); 
     } 
    } 
    else 
     std::cout << "Module path provided may be wrong. Module not found.\n\n"; 
    return 0; 
} 

और अजगर की ओर:

:

-- ttest.py -- 
from ctypes import POINTER, c_double, cast 
c_double_p = POINTER(c_double) 

import numpy as np 
from scipy import stats 

def blahptr(n, baseline_ptr, follow_up_ptr): 
    baseline = np.ctypeslib.as_array(cast(baseline_ptr, c_double_p), shape=(n,)) 
    follow_up = np.ctypeslib.as_array(cast(follow_up_ptr, c_double_p), shape=(n,)) 
    return blah(baseline, follow_up) 

def blah(baseline, follow_up): 
    paired_sample = stats.ttest_rel(baseline , follow_up) 
    print "The t-statistic is %.3f and the p-value is %.3f." % paired_sample 
    return paired_sample 

क्रम संकलन और मैक ओएस इलेवन पर कोड को चलाने के लिए निम्नलिखित का इस्तेमाल किया

$ PYENV=/path/to/python/env 
$ c++ pyfromc.cc -I$PYENV/include/python2.7 -L$PYENV/lib -lpython2.7  
$ PYTHONHOME=$PYENV DYLD_LIBRARY_PATH=$PYENV/lib ./a.out 
The t-statistic is -0.187 and the p-value is 0.857. 

निष्पादन योग्य के समान रेखा पर पर्यावरण चर सेट करके, बैश दुभाषिया केवल उन्हें आदेश की अवधि के लिए सेट करता है, न कि अन्य आदेशों के लिए।