13

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

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

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

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


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

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

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

4

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

于 2012-12-03T23:04:17.313 回答