2013-04-23 6 views
6

Jak można zrobić puste, numpy tablice typu int w Cython? Następujące prace dla mnie podwójne lub float tablic:jak zainicjować tablice z liczbami całkowitymi o stałej wielkości w języku Cython?

# make array of size N of type float 
cdef np.ndarray[float, ndim=1] myarr = np.empty(N) 
# make array of size N of type int 
cdef np.ndarray[int, ndim=1] myarr = np.empty(N) 

Jednakże, jeśli staram się zrobić to samo z int, to się nie powiedzie:

# this fails 
cdef np.ndarray[np.int, ndim=1] myarr = np.empty(N) 
# wanted to set first element to be an int 
myarr[0] = 5 

daje błąd:

ValueError : Niedopasowanie bufora dtype, oczekiwano 'int', ale otrzymało 'podwójne'

Ponieważ najwyraźniej np.empty() zwraca podwójne. Próbowałem:

cdef np.ndarray[np.int, ndim=1] myarr = np.empty(N, dtype=int) 

, ale daje ten sam błąd. Jak to zrobić?

Odpowiedz

6

zawierać zapis

cimport numpy as np 

i zadeklarować tablicę jak, powiedzmy, np.int32_t:

cdef np.ndarray[np.int32_t, ndim=1] myarr = np.empty(N, dtype=np.int32) 

można upuścić 32 z deklaracjami typu i korzystania

cdef np.ndarray[np.int_t, ndim=1] myarr = np.empty(N, dtype=np.int) 

ale wolę wyrażać się o wielkości elementów w numpy arr ay.

Zauważ, że dodałem również dtype do empty; domyślny typ dtype empty to np.float64.

+0

Dlaczego to nie działa ze zwykłym 'int' lub po prostu' np.int' w przeciwieństwie do 'np.int32_t'? – user248237dfsf

+1

Argument type deklaracji ndarray musi być typu C, a nie typu obiektu Python. Jeśli zagłębisz się w plik nagłówka numpy cython "numpy.pxd", przekonasz się, że 'np.int32_t' ostatecznie kończy się deklaracją' signed int'. –

+0

czy możesz wyjaśnić, dlaczego używasz 'dtype = np.int', a nie' dtype = np.int32_t' podczas wywoływania 'np.empty'? ten ostatni nie działa – user248237dfsf

1

Dziwne! Mam taki sam błąd, gdy próbowałem. Jednak patrząc na komunikat o błędzie, właśnie zmieniłem zakres tworzenia macierzy na funkcję i kompiluje! Nie wiem, dlaczego tak się dzieje, ale.

import numpy as np 
cimport numpy as np 

ctypedef np.int_t DTYPE_t 
DTYPE=np.int 

def new_array(): 
    cdef int length = 10 
    cdef np.ndarray[DTYPE_t, ndim=1] x = np.zeros([length], dtype=np.int) 
    return x 

x = new_array() 

myślę http://docs.cython.org/src/userguide/language_basics.html#python-functions-vs-c-functions ma pewne informacje dotyczące scopingu Pythona/C/zmiennych mieszanych.