【问题标题】:Migrating to numpy api 1.7迁移到 numpy api 1.7
【发布时间】:2016-01-02 23:51:28
【问题描述】:

我有这段代码(我的 c++ python 模块中的主函数):

static PyObject* FMM(PyObject* self, PyObject* args)
{
    PyObject *model_obj;
    PyObject *time_obj;
    PyObject *accepted_obj;
    PyObject *lat_obj;
    PyObject *lon_obj;
    PyObject *h_obj;
    int N;

    if (!PyArg_ParseTuple(args, "OOOOOOi", &model_obj, &time_obj, &accepted_obj, &lat_obj, &lon_obj, &h_obj, &N))
    {
        Py_INCREF(Py_None);
        return Py_None;
    }

    PyObject *model = PyArray_FROM_OTF(model_obj, NPY_FLOAT, NPY_INOUT_ARRAY);
    PyObject *time = PyArray_FROM_OTF(time_obj, NPY_FLOAT, NPY_INOUT_ARRAY);
    PyObject *accepted = PyArray_FROM_OTF(accepted_obj, NPY_BOOL, NPY_INOUT_ARRAY);
    PyObject *lat = PyArray_FROM_OTF(lon_obj, NPY_DOUBLE, NPY_INOUT_ARRAY);
    PyObject *lon = PyArray_FROM_OTF(lon_obj, NPY_DOUBLE, NPY_INOUT_ARRAY);
    PyObject *h = PyArray_FROM_OTF(h_obj, NPY_DOUBLE, NPY_INOUT_ARRAY);

    float *MODEL    = static_cast<float *>(PyArray_DATA(model));
    float *TIME     = static_cast<float *>(PyArray_DATA(time));
    bool *ACCEPTED  = static_cast<bool *>(PyArray_DATA(accepted));
    double *LAT     = static_cast<double *>(PyArray_DATA(lat));
    double *LON     = static_cast<double *>(PyArray_DATA(lon));
    double *H       = static_cast<double *>(PyArray_DATA(h));
    _FMM(MODEL, TIME, ACCEPTED, LAT, LON, H, N);


    Py_INCREF(Py_None);
    return Py_None;
}

我收到了警告

#warning "Using deprecated NumPy API,

我想迁移到 numpy api 1.7:

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION

我应该如何修改我的函数以在新版本的 c-api 中复制结果?你能给我举个例子吗?

【问题讨论】:

    标签: python c++ numpy


    【解决方案1】:

    嗯,这很简单:

    static PyObject* FMM(PyObject* self, PyObject* args)
    {
        PyArrayObject *model_obj;
        PyArrayObject *time_obj;
        PyArrayObject *accepted_obj;
        PyArrayObject *lat_obj;
        PyArrayObject *lon_obj;
        PyArrayObject *h_obj;
        int N;
    
        if (!PyArg_ParseTuple(args, "OOOOOOi", &model_obj, &time_obj, &accepted_obj, &lat_obj, &lon_obj, &h_obj, &N))
        {
            Py_INCREF(Py_None);
            return Py_None;
        }
    
        //PyObject *model = PyArray_FROM_OTF(model_obj, NPY_FLOAT, NPY_INOUT_ARRAY);
        //PyObject *time = PyArray_FROM_OTF(time_obj, NPY_FLOAT, NPY_INOUT_ARRAY);
        //PyObject *accepted = PyArray_FROM_OTF(accepted_obj, NPY_BOOL, NPY_INOUT_ARRAY);
        //PyObject *lat = PyArray_FROM_OTF(lon_obj, NPY_DOUBLE, NPY_INOUT_ARRAY);
        //PyObject *lon = PyArray_FROM_OTF(lon_obj, NPY_DOUBLE, NPY_INOUT_ARRAY);
        //PyObject *h = PyArray_FROM_OTF(h_obj, NPY_DOUBLE, NPY_INOUT_ARRAY);
    
        float *MODEL    = static_cast<float *>(PyArray_DATA(model_obj));
        float *TIME     = static_cast<float *>(PyArray_DATA(time_obj));
        bool *ACCEPTED  = static_cast<bool *>(PyArray_DATA(accepted_obj));
        double *LAT     = static_cast<double *>(PyArray_DATA(lat_obj));
        double *LON     = static_cast<double *>(PyArray_DATA(lon_obj));
        double *H       = static_cast<double *>(PyArray_DATA(h_obj));
        _FMM(MODEL, TIME, ACCEPTED, LAT, LON, H, N);
    
    
        Py_INCREF(Py_None);
        return Py_None;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-13
      • 2014-12-21
      • 2015-01-01
      • 2015-10-31
      • 2014-05-28
      • 2012-07-30
      • 2015-02-09
      • 2015-04-12
      相关资源
      最近更新 更多