将ndarray从Python扩展返回到C

将ndarray从Python扩展返回到C,python,c,multidimensional-array,numpy-ndarray,cpython,Python,C,Multidimensional Array,Numpy Ndarray,Cpython,我有一个C程序,从中调用Python函数。我希望这个Python函数返回一个ndarray,然后可以在我的C代码中使用它。我需要一个数据数组,因为我想让Python代码记录声音,并使用sounddevice.record()将数组发送回C代码。目前,我正在使用PyArrayObject*作为接收的变量类型(pValue)。但我得到的输出都是零。我已经尝试过这个程序来接收整数,这确实有效,所以问题就出在传递数组上 C代码 #include <stdio.h> #include <

我有一个C程序,从中调用Python函数。我希望这个Python函数返回一个ndarray,然后可以在我的C代码中使用它。我需要一个数据数组,因为我想让Python代码记录声音,并使用sounddevice.record()将数组发送回C代码。目前,我正在使用PyArrayObject*作为接收的变量类型(pValue)。但我得到的输出都是零。我已经尝试过这个程序来接收整数,这确实有效,所以问题就出在传递数组上

C代码

#include <stdio.h>
#include <Python.h>
#include <numpy/ndarrayobject.h>

int main(){
      PyObject *pName, *pModule, *pFunc;
      PyArrayObject *pValue;
      Py_Initialize();
      import_array();

      pName = PyString_FromString("audioPipe");
      pModule = PyImport_Import(pName);
      Py_DECREF(pName);

      if(pModule == NULL) printf("its null\n");
      if (pModule != NULL) {
          pFunc = PyObject_GetAttrString(pModule, "recordSound");        

          if (pFunc && PyCallable_Check(pFunc)) {
            pValue = PyObject_CallObject(pFunc, NULL);
            for(int r = 0; r < 10; r++){printf("%f\n", pValue[r]);}
            if (pValue == NULL) {
              Py_DECREF(pFunc);
              Py_DECREF(pModule);
              PyErr_Print();
              fprintf(stderr,"Call failed\n");
              return 1;
            }
          }
          else {
              if (PyErr_Occurred())
                  PyErr_Print();
              fprintf(stderr, "Cannot find function \n");
          }
          Py_XDECREF(pFunc);
          Py_DECREF(pModule);
        }
        else {
            PyErr_Print();
            fprintf(stderr, "Failed to load \\n");
            return 1;
        }
        Py_Finalize();
        return 0;
}
输出

PYTHONPATH=. ./audioPassing
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
<type 'numpy.ndarray'>
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
PYTHONPATH=/传音
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
0
0
0
0
0
0
0
0
0
0

我终于找到了使用数组的方法。我将其转换为npy\U浮点**类型。(二维,对于我的应用程序是必需的)使用PyArray_AsCarray()函数。 从那时起,你可以使用它。更大的问题主要是我的声明。我使用了错误的格式,这导致它读错了。另一个重要注意事项是,要使用PyArray_AsCArray函数,应该使用PyArray_Descr*而不是typenum。否则会出现分段错误

PyArray_Descr *descr;
descr = PyArray_DescrFromType(PyArray_TYPE(pValue));

if (PyArray_AsCArray(&pValue, (void*)&array, PyArray_DIMS(pValue), PyArray_NDIM(pValue), descr) < 0)  {
   PyErr_SetString(PyExc_TypeError, "error converting to c array");
   return NULL;
}

如果你提供一个答案,你就有更好的机会得到一个好答案,因为现在其他人需要填补你代码中的空白。对不起,这是我的第一个问题。这样更好?或者,对于一个最小的可复制示例,您是什么意思?要访问numpy数组的数据缓冲区,您需要使用PyArray_BYTES&friends
pValue
是指向对象的指针,而不是指向数据指针。我似乎找不到PyArray_字节的有效实现。我想我有一个指向数组数据的指针,如下所示。但是我如何获取这些数据呢?constdouble*temp=(constdouble*)(PyArray_字节(pValue));我尝试使用PyArray_GetPtr,但似乎不起作用。我看到的另一个实现是使用跨步npy_intp stride=PyArray_strips(temp);对于(inti=0;i<10;i++,temp++=stride){printf(“%f\n”,*temp);}但是我认为我访问了错误的内存,因为我得到了非常大的无意义的数字。
PyArray_Descr *descr;
descr = PyArray_DescrFromType(PyArray_TYPE(pValue));

if (PyArray_AsCArray(&pValue, (void*)&array, PyArray_DIMS(pValue), PyArray_NDIM(pValue), descr) < 0)  {
   PyErr_SetString(PyExc_TypeError, "error converting to c array");
   return NULL;
}
printf("datapoint: %"NPY_FLOAT_FMT"\n", array[][]);