2013-04-23 12 views
6

Come è possibile creare array numpy vuoti di tipo int in Cython? I seguenti lavori per me per gli array doppio o float:come inizializzare gli array numpy integer a dimensione fissa 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) 

Tuttavia, se cerco di fare lo stesso con int, non riesce:

# 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 

dà l'errore:

ValueError : Buffer dtype mismatch, previsto 'int' ma ottenuto 'double'

Poiché apparentemente np.empty() restituisce un doppio. Ho provato:

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

ma dà lo stesso errore. Come si può fare?

risposta

6

includere l'istruzione

cimport numpy as np 

e dichiarare la matrice come, ad esempio, np.int32_t:

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

È possibile eliminare il 32 dalle dichiarazioni di tipo, e utilizzare

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

ma preferisco essere esplicito sulla dimensione degli elementi in un arretrato numero Ay.

Nota che ho anche aggiunto il dtype a empty; il dtype predefinito di empty è np.float64.

+0

Perché questo non funziona con semplice 'int' o solo' np.int' al contrario di 'np.int32_t'? – user248237dfsf

+1

L'argomento type della dichiarazione ndarray deve essere un tipo C, non un tipo di oggetto Python. Se si digita nel file di intestazione cython numerpy 'numpy.pxd', si scoprirà che' np.int32_t' alla fine si traduce nella dichiarazione 'signed int'. –

+0

potresti spiegare perché usi 'dtype = np.int' e non' dtype = np.int32_t' quando chiami 'np.empty'? quest'ultimo non funziona – user248237dfsf

1

Ho perso lo stesso errore quando ho provato. Tuttavia, guardando il messaggio di errore, ho appena cambiato l'ambito della creazione dell'array in una funzione, e lo compila! Non conosco il motivo per cui questo sta accadendo, ma.

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

Penso http://docs.cython.org/src/userguide/language_basics.html#python-functions-vs-c-functions ha alcune informazioni relative al scoping di Python variabili/c/miste.