8

Cから段階的に受け取っている構造体の長い配列をできるだけ少ないコピーですばやく埋めたい.

次のように、構造体がプライマリ データ型のみの場合:

cdef packed struct oh_hi:
    int lucky
    char unlucky

次に、以下は正常に機能します。

  DEF MAXPOWER = 1000000
  cdef oh_hi * hi2u = <oh_hi *>malloc(sizeof(oh_hi)*MAXPOWER)
  cdef oh_hi [:] hi2me = <oh_hi[:MAXPOWER]> hi2u

しかし、文字配列を保持するように構造体を変更すると、次のようになります。

cdef packed struct oh_hi:
    int lucky
    char unlucky[10]

以前のメモリビューのキャストはコンパイルされますが、実行すると次のようになります。

  ValueError: Expected 1 dimension(s), got 1

Cythonでこれを行う簡単な方法はありますか? 私は構造化された配列を作成できることを認識していますが、それでは C 構造体を直接それに割り当てることはできません。

4

1 に答える 1

5

実際には、構造化された numpy 配列を構築してからメモリビューを作成するだけで問題なく動作します。

cdef np.ndarray hi2u = np.ndarray((MAXPOWER,),dtype=[('lucky','i4'),('unlucky','a10')])
cdef oh_hi [:] hi2me = hi2u

これのパフォーマンスは非常に良いようで、データを Python に戻す必要がある場合に、後でコピーを保存できます。いつものように、numpy バ​​ージョンはかなり良いです。=p

于 2013-06-21T16:12:25.650 に答える