【问题标题】:Can I create a PyObject* (numpy.float32)我可以创建一个 PyObject* (numpy.float32)
【发布时间】:2012-01-26 17:03:52
【问题描述】:

我正在尝试在 C(扩展 Python)中实现一个函数以返回 numpy.float32 数据类型。是否可以实际创建一个对象并返回它,这样在 python 中调用函数返回的对象是 numpy.float32 的一个实例?

(C 扩展)

PyObject *numpyFloatFromFloat(float d)
{
   ret = SomeAPICall(d)
   return ret;
}

(在python中)

a = something_special()

type(a)
-> numpy.float32

现在所有使用参考文档中记录的 API 的尝试都说明了如何制作一个产生 numpy.ndarray 的数组,到目前为止,使用数据类型产生一个 C 类型的浮点数,它在 python 中转换为双精度数。出于某种我不知道的原因,我确实需要在此函数末尾添加一个实际的 IEEE 754 float32。

目前的解决方案:

something.pyx:

cdef extern from "float_gen.h"
    float special_action(void)

def numpy_float_interface():
    return numpy.float32(special_action())

float_gen.h

static inline float special_action() { return 1.0; }

我在这里没有看到任何数据丢失,但我不能确定。我知道 numpy.float32 被视为 C float 或 float32_t 所以假设当我在 pyx 文件中调用 special_action 时它不会将其转换为双精度(如 python 那样)它应该是无损的。

编辑 最终的解决方案非常不同,我只需要了解如何使用 numpy 库在 C 中正确扩展 Python。

下面只返回一个 np.float32(32)

static PyObject *get_float(PyObject *self, PyObject *args) {
    float v = 32;
    PyObject *np_float32_val = NULL;
    PyArray_Descr *descr = NULL;
    if(! PyArg_ParseTuple(args, ""))
        return NULL;
    if(! (descr = PyArray_DescrFromType(NPY_FLOAT32))) {
        PyErr_SetString(PyExc_TypeError, "Improper descriptor");
        return NULL;
    }

    np_float32_val = PyArray_Scalar(&v, descr, NULL);
    printf("%lu\n", np_float32_val->ob_refcnt);
    return np_float32_val;
}

【问题讨论】:

    标签: python c numpy cython python-c-api


    【解决方案1】:

    这个简单的模块从 C 浮点数返回 np.int32。 cdef float 并不是真正必要的,因为 np.float32() 应该将你给它的任何东西强制转换为 np.float32。

    test_mod.pyx

    import numpy as np
    def fucn():
        cdef float a
        a = 1
        return np.float32(a)
    

    tester.py

    import pyximport
    pyximport.install()
    import test_mod
    
    a = test_mod.func()
    print type(a) # <type 'numpy.float32'>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2020-08-10
      • 2013-03-31
      • 1970-01-01
      相关资源
      最近更新 更多