CライブラリをPythonに公開するために、numpy.iでSWIGを使用しています。ラップしようとしている関数は、一連のdouble
配列を引数として取ります。
int wcsp2s(struct wcsprm *wcs, int ncoord, int nelem, const double pixcrd[], double imgcrd[], double phi[], double theta[], double world[], int stat[]);
ここで、一部の配列は実際には 2 次元であり、範囲はncoord
およびnelem
引数によって指定されます。、、またはさまざまnumpy.i
な順列 (および私の C 関数はこれらの余分な整数を必要としない) 、または. 多次元 C 配列はメモリの連続したブロックに過ぎず、関数が期待するものと互換性があるはずなので、後者は有望に見えました。でもやってみるとint n1
int n2
double * arr
double arr[ANY][ANY]
%apply (double INPLACE_ARRAY2[ANY][ANY]) {(double imgcrd[]),(double world[])};
SWIG (または、SWIG の出力で実行されている gcc) は次のように不平を言います。
wcs_wrap.c:3770:7: error: expected expression before ‘,’ token
ここで、SWIG はこれらの引数に対して無効な C コードを生成しました。
私がここでやろうとしていることは可能ですか?%inplace と %rename を使用して、配列の (不要な) 次元を取り込んで実際の関数を呼び出すラッパー関数を作成できると思います。これらの配列を出力引数として返すことができれば、インプレース配列を使用した上記のアプローチよりもさらに優れています (それらの次元はncoord
およびに基づいて簡単に計算できnelem
ます。
それとも、libwcs への高速な (つまり、astLib のものではない) python インターフェイスが既に存在するので、これを行う必要はないのでしょうか?
編集: pywcs (最初の検索で見つけたはずの明白な名前を持つ) を発見したところです。これにより、根本的な問題が解決されます。
Edit2: 1d 配列が機能しているように見えるので、2d numpy 配列 ans を平坦化されたビューに渡すラッパーが問題を回避すると思います。それでも、単純なラッパー (.i、_wrap.c、swig の .py、および次元の問題を修正するために SWIG 関数をさらにラップするための追加の .py) に大量のファイルが必要になります。