2012-12-05 16 views
15

Sto avendo qualche problema apparentemente banale con numpy quando la matrice contiene dati di stringa. Ho il seguente codice:Comportamento strano inizializzazione di una matrice numpy di dati di stringa

my_array = numpy.empty([1, 2], dtype = str) 
my_array[0, 0] = "Cat" 
my_array[0, 1] = "Apple" 

Ora, quando stampo con print my_array[0, :], la risposta che ottengo è ['C', 'A'], che non è chiaramente il risultato atteso di Cat e Apple. Perché è così, e come posso ottenere il risultato giusto?

Grazie!

risposta

28

Numpy richiede che gli array di stringhe abbiano una lunghezza massima fissa. Quando crei un array vuoto con dtype=str, imposta questa lunghezza massima su 1 per impostazione predefinita. Puoi vedere se lo fai my_array.dtype; mostrerà "| S1", che significa "stringa di un carattere". Le assegnazioni successive nell'array vengono troncate per adattarsi a questa struttura.

è possibile passare un tipo di dati esplicito con la vostra lunghezza massima facendo, ad es .:

my_array = numpy.empty([1, 2], dtype="S10") 

Il "S10" creerà un array di lunghezza 10 stringhe. Devi decidere quanto sarà grande abbastanza da contenere tutti i dati che vuoi tenere.

+0

Questo è corretto, buono a sapersi! Grazie – Jim

+0

Una volta che aggiorno un elemento nella lista (i.e 'my_array [0] = 'hello''), quel primo elemento ha ancora" 10 caratteri "di memoria allocata? O è veramente un oggetto "S5"? Presumo di no, dal momento che il 'dtype' di una matrice' numpy' deve essere coerente attraverso l'intero array? – Anonymous

+0

@jphollowed: A destra, la dimensione è fissa per l'intero array, quindi se lo si inizializza come S10, utilizzerà comunque fino a 10 byte per ogni voce, anche se le stringhe effettivamente memorizzate sono più piccole. – BrenBarn

2

ho avuto un "errore di codec" quando ho provato ad utilizzare un carattere non ASCII con dtype="S10"

Si ottiene anche un array con stringhe binarie, che mi ha confuso.

ritengo sia meglio usare:

my_array = numpy.empty([1, 2], dtype="<U10")

1

La matrice di stringhe NumPy è limitata dalla sua lunghezza fissa (lunghezza 1 di default). Se non siete sicuri che lunghezza è necessario per le stringhe in anticipo, è possibile utilizzare dtype=object e ottenere stringhe di lunghezza arbitraria per i vostri elementi di dati:

my_array = numpy.empty([1, 2], dtype=object) 

Capisco che ci possono essere svantaggi di efficienza di questo approccio, ma Non ho un buon riferimento per sostenerlo.

+0

ci sono alcuni avvertimenti (come la velocità più bassa) rispetto a, diciamo "S10"? – Boern

0

Un'altra alternativa è quella di inizializzare la seguente:

my_array = np.array([["CAT","APPLE"],['','']], dtype=str) 

In altre parole, prima di scrivere una serie regolare con ciò che si vuole, allora si gira in un array NumPy. Tuttavia, questo risolverà la lunghezza massima della stringa fino alla lunghezza della stringa più lunga durante l'inizializzazione. Quindi, se si dovesse aggiungere

my_array[1,0] = 'PINEAPPLE' 

quindi la stringa memorizzata sarebbe 'PINEA'.

Problemi correlati