扩展Python:进程numpy数组

时间:2016-07-31 17:42:23

标签: python c++ arrays python-3.x numpy

我在C ++中编写了Python 3的扩展

我的模块能够处理像[1.0, 0.0, 0.0]这样的数组。 我也想添加对numpy数组的支持。

我使用以下代码处理数组:

PyObject * MyFunction(PyObject * self, PyObject * args) {
    PyObject * list;

    if (!PyArg_ParseTuple(args, "O!:MyFunction", PyList_Type, &list)) {
        return 0;
    }

    int count = (int)PyList_Size(list);
    for (int i = 0; i < count; ++i) {
        double value = PyFloat_AsDouble(PyList_GET_ITEM(list, i));

        // ...
    }
}

我想要一个可以迭代的函数:np.array([2,3,1,0])

TL; DR:

Numpy等效于:

  • PyList_Type
  • PyList_Size
  • PyList_GET_ITEMPyList_GetItem

1 个答案:

答案 0 :(得分:1)

首先,没有Math.clamp(x, lower, upper) 等效于:

  • PyList_Type
  • PyList_Size
  • PyList_GET_ITEM或PyList_GetItem

numpy实现buffer interface,因此可以写:

numpy.array

const char * data; int size; PyArg_ParseTuple(args, "y#:MyFunction", &data, &size); 使用numpy.array([1.0, 0.0, 0.0])精度:

double

完整示例:

  • <强> C ++

    double * array = (double *)data;
    int length = size / sizeof(double);
    
  • <强>的Python

    PyObject * MyFunction(PyObject * self, PyObject * args) {
        const char * data;
        int size;
    
        if (!PyArg_ParseTuple(args, "y#:MyFunction", &data, &size)) {
            return 0;
        }
    
        double * content = (double *)data;
        int length = size / sizeof(double);
    
        for (int i = 0; i < length; ++i) {
            double value = content[i];
    
            // ...
        }
    
        Py_RETURN_NONE;
    }