Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中嵌入python/numpy+; 我试图在我的C++应用程序中使用Python 3(带有NoMPY)。 这就需要将一个C++数组发送到Python,执行计算,然后在C++中检索结果。 为此,我基于这里讨论的代码: 还有这里: 虽然从代码审查帖子中的例子基本上是工作的,但是当我修改Python和C++脚本时,我遇到了返回值的问题:当我试图返回一个在Python中创建的变量时,结果是一个Na的向量,而不是预期的计算。 我的猜测是,该对象不知何故超出了范围,但我无法解决此问题_Python_C++_Numpy_Embed - Fatal编程技术网

在C+中嵌入python/numpy+; 我试图在我的C++应用程序中使用Python 3(带有NoMPY)。 这就需要将一个C++数组发送到Python,执行计算,然后在C++中检索结果。 为此,我基于这里讨论的代码: 还有这里: 虽然从代码审查帖子中的例子基本上是工作的,但是当我修改Python和C++脚本时,我遇到了返回值的问题:当我试图返回一个在Python中创建的变量时,结果是一个Na的向量,而不是预期的计算。 我的猜测是,该对象不知何故超出了范围,但我无法解决此问题

在C+中嵌入python/numpy+; 我试图在我的C++应用程序中使用Python 3(带有NoMPY)。 这就需要将一个C++数组发送到Python,执行计算,然后在C++中检索结果。 为此,我基于这里讨论的代码: 还有这里: 虽然从代码审查帖子中的例子基本上是工作的,但是当我修改Python和C++脚本时,我遇到了返回值的问题:当我试图返回一个在Python中创建的变量时,结果是一个Na的向量,而不是预期的计算。 我的猜测是,该对象不知何故超出了范围,但我无法解决此问题,python,c++,numpy,embed,Python,C++,Numpy,Embed,我在名为mymodule.py的文件中使用以下python脚本: import numpy def array_tutorial(a): print("array_tutorial - python") print(a) print("") firstRow = a[0,:] #beta = numpy.array([[10,20,30],[10,20,30],[10,20,30]]) #firstRow = beta[0,:] retu

我在名为mymodule.py的文件中使用以下python脚本:

import numpy

def array_tutorial(a):
    print("array_tutorial - python")
    print(a)
    print("")
    firstRow = a[0,:]
    #beta = numpy.array([[10,20,30],[10,20,30],[10,20,30]])
    #firstRow = beta[0,:]
    return firstRow

def myfunction():
    beta = numpy.array([[1,2,3],[1,2,3],[1,2,3]])
    print("myfunction - python")
    print(beta)
    print("")
    firstRow = beta[0,:]
    return firstRow
< >我的C++代码在文件>强> NuPyPyCPP.CPP中,这是代码审查帖子接受的答案的略微更改和简化版本。

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION

#include <stdio.h>
#include <iostream>
#include <stdlib.h> 

#include <Python.h>
#include "numpy/arrayobject.h"

int main(int argc, char* argv[])
{
    setenv("PYTHONPATH", ".", 0);

    Py_Initialize();
    import_array();

    // Build the 2D array in C++
    const int SIZE = 3;
    npy_intp dims[2]{SIZE, SIZE};
    const int ND = 2;
    long double(*c_arr)[SIZE]{ new long double[SIZE][SIZE] };

    for (int i = 0; i < SIZE; i++){
        for (int j = 0; j < SIZE; j++){
            c_arr[i][j] = i + j;}
    }

    // Convert it to a NumPy array.
    PyObject *pArray = PyArray_SimpleNewFromData(ND, dims, NPY_LONGDOUBLE, reinterpret_cast<void*>(c_arr));

    // import mymodule
    const char *module_name = "mymodule";
    PyObject *pName = PyUnicode_FromString(module_name);
    PyObject *pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    // import function
    const char *func_name = "array_tutorial";
    PyObject *pFunc = PyObject_GetAttrString(pModule, func_name);
    PyObject *pReturn = PyObject_CallFunctionObjArgs(pFunc, pArray, NULL);
    PyArrayObject *np_ret = reinterpret_cast<PyArrayObject*>(pReturn);

    // Convert back to C++ array and print.
    int len = PyArray_SHAPE(np_ret)[0];
    long double* c_out;
    c_out = reinterpret_cast<long double*>(PyArray_DATA(np_ret));
    std::cout << "Printing output array - C++" << std::endl;
    for (int i = 0; i < len; i++){
        std::cout << c_out[i] << ' ';
    }
    std::cout << std::endl << std::endl;


    // import function without arguments
    const char *func_name2 = "myfunction";
    PyObject *pFunc2 = PyObject_GetAttrString(pModule, func_name2);
    PyObject *pReturn2 = PyObject_CallFunctionObjArgs(pFunc2, NULL);
    PyArrayObject *np_ret2 = reinterpret_cast<PyArrayObject*>(pReturn2);

    // convert back to C++ array and print
    int len2 = PyArray_SHAPE(np_ret2)[0];
    long double* c_out2;
    c_out2 = reinterpret_cast<long double*>(PyArray_DATA(np_ret2));
    std::cout << "Printing output array 2 - C++" << std::endl;
    for (int i = 0; i < len2; i++){
        std::cout << c_out2[i] << ' ';
    }
    std::cout << std::endl << std::endl;

    Py_Finalize();
    return 0;
}
为了确保找到python脚本,我为没有输入参数的函数“myfunction”添加了第二个函数调用,并删除了一些错误处理

我在Ubuntu 16.10上使用

g++ -Wall numpy_cpp.cpp -I/usr/include/python3.5m/ -lpython3.5m  
编译和链接(除了import_array()发出的一条警告外,一切正常)。我的目标是python 3

但是,运行该程序会产生以下控制台输出:

array_tutorial - python
[[ 0.0  1.0  2.0]
 [ 1.0  2.0  3.0]
 [ 2.0  3.0  4.0]]

Printing output array - C++
0 1 2 

myfunction - python
[[1 2 3]
 [1 2 3]
 [1 2 3]]

Printing output array 2 - C++
nan nan nan 
这是给我带来麻烦的最后一个输出,python返回在python脚本中设置的numpy数组的第一行。 从Python打印语句看来,NUMPY数组是好的(不是Na),但是一旦被引用到C++,事情就会向一边倾斜。 如果我在array_tutorial函数中取消对return语句上方的两行的注释,则第一次函数调用的结果相同(令人失望)

我的问题是如何在C++中获得正确的值而不需要对象(大概)超出范围?

我为这篇冗长的帖子道歉,并提前感谢您的帮助


EDIT:正如Lomeriter在下面指出的,python中的numpy数组应该在设置时牢记数据类型。 这就解决了问题。 输出接收数组的数据类型并指定声明数组的数据类型的更好的python脚本是:

import numpy

def array_tutorial(a):
    print("array_tutorial - python")
    print(a)
    print(numpy.dtype(a[0,0]))
    print("")
    firstRow = a[0,:]
    #beta = numpy.array([[10,20,30],[10,20,30],[10,20,30]],dtype=numpy.float128)
    #firstRow = beta[0,:]
    return firstRow

def myfunction():
    beta = numpy.array([[1,2,3],[1,2,3],[1,2,3]],dtype=numpy.float128)
    print("myfunction - python")
    print(beta)
    print("")
    firstRow = beta[0,:]
    return firstRow

在Python代码中创建数组时,应该指定dtype。您在C++代码中被铸造成长双倍,而dType被推断为是在64位平台上的It64(

),非常感谢,这确实解决了问题。正确的数据类型是“numpy.float128”(在我的例子中),我得到了这个错误

main.cpp:26:21:error:expected';'在声明结束时,npy_intp dims[2]{SIZE,SIZE}
import numpy

def array_tutorial(a):
    print("array_tutorial - python")
    print(a)
    print(numpy.dtype(a[0,0]))
    print("")
    firstRow = a[0,:]
    #beta = numpy.array([[10,20,30],[10,20,30],[10,20,30]],dtype=numpy.float128)
    #firstRow = beta[0,:]
    return firstRow

def myfunction():
    beta = numpy.array([[1,2,3],[1,2,3],[1,2,3]],dtype=numpy.float128)
    print("myfunction - python")
    print(beta)
    print("")
    firstRow = beta[0,:]
    return firstRow