我想在C(擴展Python)中實現一個函數來返回一個numpy.float32數據類型。是否有可能實際創建一個對象並將其返回,例如在python中,從調用該函數返回的對象是numpy.float32的一個實例?我可以創建一個PyObject *(numpy.float32)
(C擴展)
PyObject *numpyFloatFromFloat(float d)
{
ret = SomeAPICall(d)
return ret;
}
(在python)
a = something_special()
type(a)
-> numpy.float32
現在在使用參考文檔中記錄的API的所有嘗試說明如何製備這產生numpy的數組。 ndarray,到目前爲止使用這些數據類型會產生一個C型的float,它會在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())
float_gen.h
static inline float special_action() { return 1.0; }
我在這裏看不到數據的任何損失,但我不能確定。我知道一個numpy.float32被視爲C float或float32_t,因此假設我在pyx文件中調用special_action時,它不會將它轉換爲double(如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;
}