【发布时间】:2015-07-17 10:15:30
【问题描述】:
我正在调用一个 python 函数来从我的 C++ 代码中计算“t-test”。函数调用如下:
#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;
}
而我的python模块定义如下:
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)
但如果我明确定义一个列表并尝试执行“t-test”函数,它运行得很好。运行函数定义如下:
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
我假设我在定义传递给 python 脚本的列表时犯了一些错误,但不知道是什么。任何帮助将不胜感激。
【问题讨论】:
-
阅读您的描述并没有让我感到惊讶,所以它看起来不错。只是为了好奇,您调用
blah()并且错误在numpy.stats(),到达blah()的值是什么?使用print repr(baseline)和print repr(follow_up)输出它们的表示。也就是说,为什么你仍然使用 Python 2? Numpy 至少在当前的 Python 中也可用。 -
嗯,也许是个愚蠢的问题,但您是否考虑过使用预先存在的 t-tests from scipy 而不是重新实现它们?