如何定义自定义float-type numpy dtypes(C-API)

时间:2012-12-01 11:33:27

标签: c++ python numpy boost-python

我有一个自定义浮点数据类型,它使用两个64位浮点数(来自QD library的双重类dd_real)来模拟128位浮点数。从C ++我想导出一个ndarray到python。我已经知道如何为64位浮点数做这个,但是对于双倍的我需要指定我自己的自定义dtype。怎么做?

注意:numpy有自己的128位浮点数(np.float128),遗憾的是它在C / C ++中映射到long double,它只是存储在128位(在我所有平台上)的80位浮点数。

事实上,人们应该能够以与numpy导出np.float128相同的方式执行此操作(我只是不知道如何完成),唯一的区别是它使用dd_real C ++方面而不是long double

如果这有帮助,我已经使用dd_real将C ++类型boost::python导出到python,这可能会以某种方式重用。


到目前为止,我能够研究以下内容

  1. dtypes的numpy文档引用了C-API有关如何导出自定义dtypes的信息,但该文档仅以某种方式解释了现有的dtypes而不是如何创建新的dtypes。

  2. browsing stackoverflow我发现this示例时,我想知道对于dd_real这是否更简单。我也看不到实际生成dtype的位置。也许只能通过np.typeDict['quaternion'] = np.dtype(quaternion)在py __ init__中。当我想生成一个ndarray时,如何在C ++中使用该dtype?

1 个答案:

答案 0 :(得分:4)

您关联的存储库

https://github.com/numpy/numpy-dtypes

可能包含有关如何将新dtype添加到Numpy的最简单的示例。我不知道更简单的方法。请注意这些文件中对register_cast_functionREGISTER_UFUNC的调用:这些告诉Numpy如何在逐个元素级别处理乘法和转换等操作。

但是,如果你真正想做的只是导出你的数据,你可以只导出一个双打数组,或者将两个双打捆绑到一个数据类型

np.dtype([('a', double), ('b', double)])

然后,您需要编写单独的函数来对这些数组执行操作(因为arr1 * arr2将无法执行您想要的操作)。进一步使arr1 * arr2工作的一种可能方法是将np.ndarray子类化为您的数据类型,覆盖__mul__等操作。