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

H. *_*ier 13 c++ python numpy boost-python

我有使用两个64位浮点数(两双类模拟128bit的浮筒的自定义浮点数据类型dd_realQD库).从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. 对于numpy的文件dtypes指的是 C-API如何导出自定义dtypes,但不知何故文件只解释了现有的dtypes不是如何创建新的.

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

pv.*_*pv. 4

您链接到的存储库,

https://github.com/numpy/numpy-dtypes
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您真正想做的只是导出数据,则可以导出为双精度数组,或者将两个双精度值捆绑到单个数据类型

np.dtype([('a', double), ('b', double)])
Run Code Online (Sandbox Code Playgroud)

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

  • 好吧,我需要从 C++ 构造一个 ndarray,为此我需要 C++ 中的 dtype。 (2认同)