2016-11-03 15 views
0

私は​​を使って動的ライブラリからコンパイルされた関数を実行するPython 2.7モジュールを開発しています。このクラスには、イメージを表すそのライブラリのC構造体をラップするクラスが含まれており、Cコードからデータを受け取るために使用されます。Pythonオブジェクトをnumpy配列のように振る舞う方法は?

ダイナミックライブラリは、特にPythonラッパー用のデータのディープコピーを実行します。

モジュールでの処理はnumpyの配列を使用して行われるため、Cコードから取得したデータをnumpy.ndarrayに変換する必要があります。

速度とメモリの消費量は今のところ問題になりません。

今のところ、numpy.frombuffer関数を使用してnumpy.ndarrayを作成して返します。

もっとうまく実装できるかどうか疑問に思っています。ここで

は、Arrayインタフェースの記述があり、Pythonのクラス

import ctypes as ct 
import numpy as np 

class C_Mat(ct.Structure): 
    _fields_ = [("rows", ct.c_int), 
       ("cols", ct.c_int), 
       ("data", ct.c_char_p), 
       ("step", ct.ARRAY(ct.c_int64, 2)), 
       ("data_type", ct.c_int)] 

    _dtypes = { 0: np.uint8, 
       1: np.int8, 
       2: np.uint16, 
       3: np.int16, 
       4: np.int32, 
       5: np.float32, 
       6: np.float64 } 


    def image(self): 
     r = np.frombuffer(self.data, 
          dtype=self._dtypes[self.data_type], 
          count=self.cols*self.step[1]*self.step[0]) 
     r.shape = (self.cols, self.rows) 
     r.strides = (self.step[0], self.step[1]) 

    return r 

答えて

関連する問題