4

このデータに対して何らかのアクションを実行したい numpyarray と C++ コードに 2 次元データがあります。swig と distutils を使用numpy.iして、関数を提供する Python 拡張機能「goldstein」にすべてをコンパイルすることができましたunwrap2d。私はそれを使用してテストします

import goldstein

data = np.ascontiguousarray(data_temp, dtype='double')
mask = np.ascontiguousarray(mask_temp, dtype='uint16')
outdata = np.ones_like(data)

goldstein.unwrap2d(data,mask,outdata)

を取得しTypeError: array cannot be safely cast to required typeます。これらの配列を正しい方法で渡す方法を教えてもらえますか?

参考までに:モジュールを作成するために、インターフェイスファイルを使用しました

%define DOCSTRING
"Wrapper for c++-code"
%enddef

%module(docstring=DOCSTRING) goldstein

%{
    #define SWIG_FILE_WITH_INIT
    #include "goldstein.h"
%}

/*include numpy typemaps*/
%include "numpy.i"
/*initialize module*/
%init %{
    import_array();
%}

%rename(unwrap2d) phase_unwrapping_func;

/* typemaps for the arrays*/
%apply (int DIM1,int DIM2,float* IN_ARRAY2) {(int xsize,int ysize,float* in)};
%apply (int DIM1,int DIM2,unsigned short* IN_ARRAY2) {(int x1,int y1,unsigned short* mask)};
%apply (int DIM1,int DIM2,float* INPLACE_ARRAY2) {(int x2,int y2,float* out)};

/*wrapper function calling the original phase_unwrapping using only the needed parameters*/
%inline %{
void phase_unwrapping_func(int xsize,int ysize,float* in,int x1,int y1,unsigned short* mask,int x2,int y2,float* out) {
    phase_unwrapping(xsize, ysize, in, mask, out);
    }
%}
4

1 に答える 1

0

@ジェイミーはもちろん正しいです。'double' のような 'float' は numpy で 64 ビットであるため、もう一度確認しませんでした。しかし、c++ の float には明らかに 32 ビットが必要で、これは numpy では'float32'. ありがとうございました!

于 2013-08-16T13:37:39.130 に答える