gpt4 book ai didi

python - 我可以创建一个 PyObject* (numpy.float32)

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:28 25 4
gpt4 key购买 nike

我正在尝试用 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 类型的 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;
}

最佳答案

这个简单的模块从 C float 返回 np.int32。 cdef float 并不是真正必要的,因为 np.float32() 应该将您提供给它的任何内容强制转换为 np.float32。

test_mod.pyx

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

测试器.py

import pyximport
pyximport.install()
import test_mod

a = test_mod.func()
print type(a) # <type 'numpy.float32'>

关于python - 我可以创建一个 PyObject* (numpy.float32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com