【问题标题】:How to define custom float-type numpy dtypes (C-API)如何定义自定义浮点类型 numpy dtypes (C-API)
【发布时间】:2012-11-19 11:43:25
【问题描述】:

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

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

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

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


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

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

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

【问题讨论】:

    标签: c++ python numpy boost-python


    【解决方案1】:

    您链接到的存储库,

    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__ 等操作。

    【讨论】:

    • C++ 中np.dtype(...) 的等价物是什么?
    • 用元组构造列表,并调用PyArray_DescrConverter。但是只导出一个双精度数组并在 Python 端执行此操作可能更容易。
    • 嗯,我需要从 C++ 构造一个 ndarray,为此我需要 C++ 中的 dtype。
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2013-09-07
    • 2012-12-14
    • 2013-02-10
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多