Python 我可以创建PyObject*(numpy.float32)吗

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在

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

(C)延期

(python语言)

目前,使用参考文档中记录的API的所有尝试都说明了如何生成一个数组,该数组生成numpy.ndarray,到目前为止,使用数据类型生成一个C型浮点,该浮点在python中转换为double。出于某种我不知道的原因,我真的需要一个实际的IEEE 754 float32在这个函数的末尾

迄今为止的解决办法:

something.pyx:

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'>