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