1. 程式人生 > >C中處理Python的Numpy陣列的程式碼範例

C中處理Python的Numpy陣列的程式碼範例

  今天處理Python的返回值,折騰了半天,又是連蒙帶猜,找到了辦法。為了方便大家,特別提供出來。希望給其他人帶來工作上的順利。

int fext_python_action(const ImageBuffer* pImage, DataBuffer* pOutput)
{
  PyObject* pArgs = PyTuple_New(1);
  PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 1));

  PyObject* pResult = PyObject_CallObject(g_pPythonFunction_FextAction, pArgs);

    //開始處理返回值。具體含義看註釋。通過執行測試。
    PyArrayObject* pContArray = PyArray_GETCONTIGUOUS((PyArrayObject*)pResult);
    float* pDataPtr = (float*)PyArray_DATA(pContArray);
    
    //陣列多少個維度?
    int num_dim = PyArray_NDIM(pContArray);
    //每個維度的長度
    npy_intp* pDim = PyArray_DIMS(pContArray);

    //得到元素總數
    int nDataCount = 1;
    for (int i = 0; i < num_dim; i++)
    {
        nDataCount *= pDim[i];
    }
    GH_LOG_INFO("num_dim=%d, nDataCount=%d", num_dim, nDataCount);

    //輸出前4個
    for (int i = 0; i < 4; i++)
    {
        GH_LOG_INFO("data[%d]=%f", i, pDataPtr[i]);
    }

    //輸出後4個
    for (int i = nDataCount-4; i < nDataCount; i++)
    {
        GH_LOG_INFO("data[%d]=%f", i, pDataPtr[i]);
    }

  Py_DECREF(pContArray);
  Py_DECREF(pResult);
  Py_DECREF(pArgs);
  return 0;
}