首页 文章

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

提问于
浏览
13

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

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

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

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


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

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

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

1 回答

  • 4

    您链接到的存储库,

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

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

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

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

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

相关问题