2013-04-23 16 views
6

Wie kann man in Cython leere numpy Arrays vom Typ int machen? Die folgenden Werke für mich für doppelte oder float Arrays:Wie initialisiert man Integer-Numpy-Arrays fester Größe in 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) 

Allerdings, wenn ich versuche, mit int das Gleiche zu tun, ist es nicht:

# 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 

es den Fehler gibt:

Valueerror : Puffer dtype Mismatch, erwartet 'int', aber bekam 'doppelt'

Da anscheinend np.empty() ein Doppel zurückgibt. Ich habe versucht:

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

aber es gibt den gleichen Fehler. Wie kann das gemacht werden?

Antwort

6

Fügen Sie die Anweisung

cimport numpy as np 

und erklären das Array als, sagen wir, np.int32_t:

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

Sie können die 32 von den Typdeklarationen fallen, und verwenden Sie

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

aber ich ziehe es vor, explizit über die Größe der Elemente in einem numply arr ja.

Beachten Sie, dass ich auch den dtype zu empty hinzugefügt habe; Der Standarddtyp von empty ist np.float64.

+0

Warum funktioniert das nicht mit plain 'int' oder nur' np.int' im Gegensatz zu 'np.int32_t'? – user248237dfsf

+1

Das Typargument der ndarray-Deklaration muss ein C-Typ sein, kein Python-Objekttyp. Wenn Sie in die numplige Cython-Header-Datei 'numpy.pxd' schauen, werden Sie feststellen, dass' np.int32_t' letztendlich zur Deklaration 'signed int' führt. –

+0

könnten Sie erklären, warum Sie 'dtype = np.int' und nicht' dtype = np.int32_t' verwenden, wenn Sie 'np.empty' aufrufen? Letzteres funktioniert nicht – user248237dfsf

1

Wierd! Ich habe den gleichen Fehler, als ich es versuchte. Wenn ich jedoch die Fehlermeldung ansehe, habe ich einfach den Umfang der Array-Erstellung in eine Funktion geändert, und es wird kompiliert! Ich weiß nicht, warum das so ist, aber.

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() 

ich http://docs.cython.org/src/userguide/language_basics.html#python-functions-vs-c-functions denken hat einige Informationen im Zusammenhang mit Scoping von Python/c/gemischter Variablen.

Verwandte Themen