2012-12-01 9 views
12

2つの64ビット浮動小数点を使用する128ビット浮動小数点数をエミュレートするカスタム浮動小数点データ型があります(QD libraryのdouble doubleクラスdd_real)。 C++からは、ndarrayをPythonにエクスポートしたいと思います。私はすでに64ビット浮動小数点数のためにこれを行う方法を知っていますが、倍精度浮動小数点型のために私は何とか自分のカスタムdtypeを指定する必要があります。どうやってするか?カスタムフロート型numpy型(C-API)を定義する方法

注:numpyのは、独自の128ビットの浮動小数点数(np.float128)残念ながら、これは単なる(私のプラットフォームのすべての)128ビットに保存されている80ビットフロートであるC/C++でlong doubleにマップしています。

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

これが役に立ちましたら、boost::pythonを使用して、すでにC++のタイプdd_realをPythonにエクスポートしています。これは何とか再利用できます。


これまでのところ、私は、次の

  1. dtypesためのnumpyのドキュメントは、カスタムdtypesをエクスポートする方法についてはC-APIを指しますが、その文書は何とかだけでなく、どのように既存のdtypesを説明を研究することができました新しいものを作成する。

  2. browsing stackoverflow私はthis例を見つけましたが、これはdd_realの方が簡単かもしれません。私はまた、dtypeが実際に生成される場所を見ません。たぶんpython __ init__からnp.typeDict['quaternion'] = np.dtype(quaternion)経由でのみです。 ndarrayを生成したいときに、そのdtypeをC++でどのように使うのですか?

答えて

4

あなたは

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

、にリンクされているリポジトリはおそらくnumpyのに新しいDTYPEを追加する方法については、できるだけ簡単な例が含まれています。私は簡単な方法を知らない。これらのファイルには、register_cast_functionREGISTER_UFUNCの呼び出しがあります。これらはNumpyに、乗算やキャストなどの演算をどのように要素ごとのレベルで扱うべきかを示します。あなたが実際にやりたいことだけ、あなたのデータをエクスポートする場合

しかし、あなただけの、

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

次にdoubleの配列、または多分単一のデータ型に2倍をバンドルとしてあなたをエクスポートすることができこれらの配列で操作を行うために別々の関数を書く必要があります(arr1 * arr2はここで必要なことをしません)。さらに進んで、arr1 * arr2を動作させる方法の1つは、np.ndarrayのデータ型をサブクラス化し、__mul__などの操作をオーバーライドすることです。

+0

C++で 'np.dtype(...)'と同等のものは何ですか? –

+1

タプルでリストを構築し、 'PyArray_DescrConverter'を呼び出します。しかし、おそらく二倍の配列をエクスポートし、Python側でそれを行うほうが簡単でしょう。 –

+2

私はC++からndarrayを構築する必要があり、そのためにはC++でdtypeが必要です。 –

関連する問題