Python 如何从NPY_对象的numpy.ndarray获取字符串值

Python 如何从NPY_对象的numpy.ndarray获取字符串值,python,c,numpy,Python,C,Numpy,我正在尝试使用python和numpy的C API获取pandas.DataFrame中的列名称。我正在Windows 7和64位python v3.6下使用Microsoft Visual Studio 2015。我能够获得df.axes[1]的值,但是当我使用PyArray_GETPTR1时,结果似乎无效 这是我的密码: // Initialize python Py_SetPythonHome(L"C:\\Program Files\\Python36"); Py_Initialize()

我正在尝试使用python和numpy的C API获取pandas.DataFrame中的列名称。我正在Windows 7和64位python v3.6下使用Microsoft Visual Studio 2015。我能够获得df.axes[1]的值,但是当我使用PyArray_GETPTR1时,结果似乎无效

这是我的密码:

// Initialize python
Py_SetPythonHome(L"C:\\Program Files\\Python36");
Py_Initialize();

// Initialize numpy
import_array();

// Build script
PyCompilerFlags flags;
flags.cf_flags = PyCF_SOURCE_IS_UTF8;
PyObject* compiled = Py_CompileStringFlags(
    "import numpy as np\n"
    "import pandas as pd\n"
    "def ReturnDataFrame():\n"
    "    df = pd.DataFrame({'AAA' : [4,5,6,7], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})\n"
    "    return df\n",
    "test.py", Py_file_input, &flags
);
PyObject* codeModule = PyImport_ExecCodeModule("test.py", compiled);

// Call the function
PyObject* pFunc = PyObject_GetAttrString(codeModule, "ReturnDataFrame");
PyObject* pReturn = PyObject_CallObject(pFunc, nullptr);
Py_XDECREF(pFunc);

// Display column headers
PyObject* axes = PyObject_GetAttrString(pReturn, "axes");
PyObject* columnLabelsIndex = PyList_GET_ITEM(axes, 1);
PyObject* columns = PyObject_GetAttrString(columnLabelsIndex, "values");
const char* typeName = columns->ob_type->tp_name; // == "numpy.ndarray"
PyArrayObject* columnArray = (PyArrayObject*)columns;
int length = PyArray_DIMS(columnArray)[0];
int elementType = PyArray_TYPE(columnArray); // == NPY_OBJECT
for (int i = 0; i < length; i++)
{
    PyObject* pElementValue = (PyObject*)PyArray_GETPTR1(columnArray, i);
    typeName = pElementValue->ob_type->tp_name; // invalid
    char* str = PyUnicode_AsUTF8(pElementValue);
    std::cout << str;
    std::cout << " ";
}
std::cout << "\n";
//初始化python
Py_SetPythonHome(L“C:\\Program Files\\Python36”);
Py_初始化();
//初始化numpy
导入数组();
//构建脚本
PyCompilerFlags标志;
flags.cf_flags=PyCF_SOURCE_为_UTF8;
PyObject*compiled=Py\u CompileStringFlags(
“将numpy作为np导入\n”
“将熊猫作为pd导入\n”
“def ReturnDataFrame():\n”
“df=pd.数据帧({'AAA':[4,5,6,7],'BBB':[10,20,30,40],'CCC':[100,50,-30,-50]})\n”
“返回df\n”,
“test.py”、py\u文件输入和标志
);
PyObject*codeModule=PyImport\u ExecCodeModule(“test.py”,编译);
//调用函数
PyObject*pFunc=PyObject_GetAttrString(codeModule,“ReturnDataFrame”);
PyObject*pReturn=PyObject_CallObject(pFunc,nullptr);
Py_XDECREF(pFunc);
//显示列标题
PyObject*axes=PyObject_GetAttrString(预旋转,“轴”);
PyObject*columnLabelsIndex=PyList\u GET\u项(轴,1);
PyObject*columns=PyObject_GetAttrString(columnLabelsIndex,“值”);
常量字符*typeName=列->对象类型->tp\u名称;//==“numpy.ndarray”
PyArrayObject*columnArray=(PyArrayObject*)列;
int length=PyArray_DIMS(columnArray)[0];
int elementType=PyArray_TYPE(columnArray);//=NPY_对象
for(int i=0;iob_type->tp_name;//无效
char*str=PyUnicode_AsUTF8(pElementValue);

std::难道
length
有您期望的值吗?是的,长度是3