2012-01-26 78 views
2

我想在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; 
} 

回答

1

這個簡單的模塊返回從C浮子np.int32。因爲np.float32()應該強制你將它提供給np.float32,所以cdef float並不是必須的。

test_mod.pyx

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

tester.py

​​
相關問題