13

2つの64ビットfloat( QDライブラリdd_realのdouble-doubleクラス)を使用して128ビットfloatをエミュレートするカスタムfloatデータ型があります。C++からndarrayをpythonにエクスポートしたいと思います。64ビットフロートの場合はこれを行う方法をすでに知っていますが、ダブルダブルの場合はどういうわけか独自のカスタムdtypeを指定する必要があります。どうやってするか?

注:numpyには独自の128ビットfloat(np.float128)がありますが、残念ながら、これlong doubleはC / C ++にマップされます。これは、128ビットに格納された80ビットfloatにすぎません(すべてのプラットフォームで)。

実際、numpyがnp.float128をエクスポートするのとまったく同じ方法でこれを実行できるはずです(これがどのように行われるかはわかりません)がdd_real、C++側で.の代わりに使用する唯一の違いがありlong doubleます。

これが役に立ったら、私はすでにC ++タイプdd_realをPythonにエクスポートしましたが、boost::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を使用するにはどうすればよいですか?

4

1 に答える 1

4

リンク先のリポジトリ、

https://github.com/numpy/numpy-dtypes

おそらく、新しい dtype を Numpy に追加する方法に関する最も単純な例が含まれています。もっと簡単な方法を知りません。これらのファイルの呼び出しに注意してくださいregister_cast_function:REGISTER_UFUNCこれらは、要素ごとのレベルで乗算やキャストなどの操作をどのように処理する必要があるかを Numpy に伝えます。

ただし、実際にデータをエクスポートするだけの場合は、double の配列としてエクスポートするか、2 つの double を 1 つのデータ型にバンドルすることができます。

np.dtype([('a', double), ('b', double)])

次に、これらの配列に対して操作を行うには、別の関数を作成する必要があります (arr1 * arr2ここで必要なことは実行されません)。さらに進んで機能させる方法の 1 つは、データ型arr1 * arr2をサブクラス化し、その他の操作np.ndarrayをオーバーライドすることです。__mul__

于 2012-12-03T23:04:17.313 に答える