Я следовал руководству по boost :: python :: numpy, обнаружил, что ndarray и массив numpy могут быть общими внутри кода C ++, и обнаружил, что с помощью примера Python Boost я могу вызвать функцию python в C ++ с аргументами и возвратом.
Моя цель состоит в том, чтобы boost python и python обменивались значениями numpy массивов.
Сначала я попытался передать numpy массив в код python с помощью boost python.Однако я нашел способ установить для pylist значение PyList_SET_ITEM только путем создания pylist вместо массива numpy.
В C ++
//https://docs.python.org/2.0/ext/buildValue.html
PyObject *Convert_Big_Array(long arr[], int length) {
PyObject *pylist, *item;
pylist = PyList_New(length);
if (pylist != NULL)
for (int i = 0; i < length; i++) {
item = PyLong_FromLong(arr[i]);
PyList_SET_ITEM(pylist, i, item);
}
return pylist;
}
int main() {
long arr[5] = { 4,3,2,6,10 };
// Python 3.x Version
Py_SetPythonHome(L"C:\\Users\\User\\Anaconda3");
PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *presult;
Py_Initialize();
return 0;
}
pDict = PyModule_GetDict(pModule);
pFunc = PyDict_GetItemString(pDict, (char*)"someFunction");
if (PyCallable_Check(pFunc)) {
pValue = Py_BuildValue("(O)", Convert_Big_Array(arr, 5));
PyErr_Print();
presult = PyObject_CallObject(pFunc, pValue);
PyErr_Print();
}
else {
PyErr_Print();
return 0;
}
boost::python::handle<> handle(presult);
std::cout << std::endl << "Python ndarray :" << p::extract<char const *>(p::str(handle)) << std::endl;
Py_DECREF(pValue);
Py_DECREF(pModule);
Py_DECREF(pName);
Py_Finalize();
return 0;
}
В Python
import numpy as np
def someFunction(text):
print(text)
return np.array([1,2,3])
С этим кодом мне очень трудно передать очень большой массив C int в Python.Есть ли более эффективный способ?
Во-первых, если я могу преобразовать массив C ++ в ndarray, используя np :: from_data, а затем преобразовать его в PyObject, я думаю, что я могу передать сам этот объект в python.
Во-вторых, я хочу преобразовать PyObject (presult), созданный с помощью PyObject_CallObject, в формат np :: ndarray.Теперь код является только примером, и вывод успешен.
Другими словами, знаете ли вы, как конвертировать ndarray (C ++) -> PyObject (C ++), PyObject (numpy c ++)) -> ndarray (c ++)?