【发布时间】: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