如何定义自定义的浮点型numpy数据类型(C-API)

13
我有一个自定义的浮点数据类型,使用两个64位浮点数(来自QD库中的double-double类dd_real)模拟128位浮点数。从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,也许可以以某种方式重用它。

我能够研究到以下内容:

  1. NumPy的dtypes文档提到了C-API,介绍如何导出自定义的数组类型,但该文档只讲解了现有的数组类型,并未说明如何创建新的数组类型。

  2. 浏览stackoverflow时,我发现了这个例子,但我想知道对于dd_real来说是否可以更简单。我也不知道生成的数据类型实际上在哪里。可能只在Python的__init__函数中,通过np.typeDict['quaternion'] = np.dtype(quaternion)语句来定义。当我想要生成一个ndarray时,如何在C++中使用这个数据类型?

1个回答

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


еңЁC++дёӯпјҢnp.dtype(...)зҡ„зӯүд»·зү©жҳҜд»Җд№Ҳпјҹ - H. Brandsmeier
1
构建包含元组的列表,并调用 PyArray_DescrConverter。但在 Python 端导出一个双精度数组可能更容易实现。 - pv.
2
我需要在C++中构建一个ndarray,因此我需要C++中的dtype。 - H. Brandsmeier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接