2013-06-21 61 views
7

我想迅速用盡可能少的拷貝爲我逐步從CCython Memoryviews - 來自結構數組?

接收結構的可能的多頭排列填寫如果我的結構是隻有小學數據類型,如下所示:

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] 

以前memoryview鑄造編譯但在運行時會給出一個:

ValueError: Expected 1 dimension(s), got 1 

有沒有一種簡單的方法在用Cython做到這一點?我知道我可以創建一個結構化數組,但是afaik,它不會讓我直接將C結構分配給它。

+0

這與numpy結構化數組似乎與[此問題](https://stackoverflow.com/q/30035287/2588654)非常相似。問題是,如果結構中的第一項是標量,cython似乎不喜歡混合數組和標量值。解決方法是重新排列結構中的項目,以便首先總是有一個數組成員/項目。 – CodeSurgeon

回答

3

其實,只是建立一個結構化的numpy數組,然後memoryview工作得很好。

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

這樣做的表現似乎相當不錯,如果你需要把數據傳回在Python這樣可以節省以後的副本。按照慣例,numpy版本非常好。 = p

+1

這不適合我。也許是因爲我使用了固定的'''int32'''而不是字符串'a10'。我最終弄平了這些結構。 – dashesy

+0

我會研究這個,但你是如何希望這些會被存儲在numpy結構? – radikalus

+0

10個整數,行('幸運',(np.int32,10)) – dashesy