Python 我可以创建PyObject*(numpy.float32)吗
我试图在C(扩展Python)中实现一个函数,以返回numpy.float32数据类型。是否可以实际创建一个对象并返回它,这样在python中调用函数返回的对象就是numpy.float32的实例 (C)延期 (python语言) 目前,使用参考文档中记录的API的所有尝试都说明了如何生成一个数组,该数组生成numpy.ndarray,到目前为止,使用数据类型生成一个C型浮点,该浮点在python中转换为double。出于某种我不知道的原因,我真的需要一个实际的IEEE 754 float32在这个函数的末尾 迄今为止的解决办法: something.pyx:Python 我可以创建PyObject*(numpy.float32)吗,python,c,numpy,cython,python-c-api,Python,C,Numpy,Cython,Python C Api,我试图在C(扩展Python)中实现一个函数,以返回numpy.float32数据类型。是否可以实际创建一个对象并返回它,这样在python中调用函数返回的对象就是numpy.float32的实例 (C)延期 (python语言) 目前,使用参考文档中记录的API的所有尝试都说明了如何生成一个数组,该数组生成numpy.ndarray,到目前为止,使用数据类型生成一个C型浮点,该浮点在python中转换为double。出于某种我不知道的原因,我真的需要一个实际的IEEE 754 float32在
cdef extern from "float_gen.h"
float special_action(void)
def numpy_float_interface():
return numpy.float32(special_action())
第h代浮子
static inline float special_action() { return 1.0; }
我没有看到任何数据丢失,但我不能确定。我知道numpy.float32被视为C float或float32,因此假设我在pyx文件中调用特殊操作时,它不会将其转换为double(就像python那样),它应该是无损的
编辑
最终的解决方案非常不同,我只需要理解如何使用numpy库在C中正确地扩展Python
下面只返回一个np.float32(32)
这个简单的模块从C浮点返回np.int32。cdef float实际上并不是必需的,因为np.float32()应该强制将您给予它的任何东西交给np.float32 测试模块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'>
导入pyximport
pyximport.install()
导入测试模块
a=测试函数
打印类型(a)#
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;
}
import numpy as np
def fucn():
cdef float a
a = 1
return np.float32(a)
import pyximport
pyximport.install()
import test_mod
a = test_mod.func()
print type(a) # <type 'numpy.float32'>