簡體   English   中英

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

[英]How to define custom float-type numpy dtypes (C-API)

我有一個自定義浮點數據類型,使用兩個64位浮點( QD庫中的雙重類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_realboost::python也許這可以以某種方式重用。


到目前為止,我能夠研究以下內容

  1. dtypes的numpy文檔是指如何導出自定義dtypes的C-API ,但該文檔僅以某種方式解釋了現有的dtypes而不是如何創建新的dtypes。

  2. 瀏覽 stackoverflow時我發現了這個例子,但我想知道對於dd_real這是否可以更簡單。 我也看不到實際生成dtype的位置。 也許只能在python __ init__中通過np.typeDict['quaternion'] = np.dtype(quaternion) 當我想生成一個ndarray時,如何在C ++中使用該dtype?

您鏈接到的存儲庫,

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子類np.ndarray您的數據類型,覆蓋__mul__等操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM