2013-06-21 18 views
7

Chciałbym szybko napełnić jak kilku kopiach, jak to możliwe długi tablicy kodowanym że jestem otrzymujących stopniowo od CCredo Pamięci - z zestawu struktur?

Jeśli moja struct jest tylko podstawowe typy danych, jak następuje:

cdef packed struct oh_hi: 
    int lucky 
    char unlucky 

Wtedy następujące prace dobrze:

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

Ale kiedy mogę zmienić struct trzymać tablicę znaków:

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

Dotychczasowe kompiluje odlewania memoryview ale gdy bieg daje:

ValueError: Expected 1 dimension(s), got 1 

Czy istnieje prosty sposób to zrobić w Cython? Zdaję sobie sprawę, że mógłbym stworzyć strukturę tablicy, ale afaik, która nie pozwoliłaby mi bezpośrednio przypisać struktur C.

+0

To wydaje się być bardzo podobne do [ten problem] (https://stackoverflow.com/q/30035287/2588654) z numpy uporządkowanymi tablicami. Problem w tym, że cyton wydaje się nie lubić mieszania tablic z wartościami skalarnymi, jeśli pierwszy element w strukturze jest skalarem. Obejście polega na zmianie kolejności elementów w strukturze tak, aby zawsze istniał element/element tablicy. – CodeSurgeon

Odpowiedz

3

Właściwie, po prostu budowanie uporządkowanej tablicy numpy, a następnie widok pamięci działa dobrze.

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

Wydajność tego wydaje się całkiem dobra, a to zapisuje później kopię, jeśli potrzebujesz danych z powrotem w python. Jak zwykle, wersja numpy jest całkiem niezła. = p

+1

To nie działa dla mnie. Może dlatego, że użyłem stałej tablicy '' 'int32''', a nie łańcucha 'a10'. Skończyłem na spłaszczeniu struktur. – dashesy

+0

Zajmę się tym, ale jak miałeś nadzieję, że zostaną one zapisane w strukturze numpy? – radikalus

+0

dla 10 liczb całkowitych, coś linii ("szczęście", (np.int32,10)) – dashesy