2012-12-05 4 views
15

Ich habe einige scheinbar triviale Probleme mit numpy, wenn das Array String-Daten enthält. Ich habe den folgenden Code:Seltsames Verhalten, das ein numpiges Array von String-Daten initialisiert

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

Nun, wenn ich es mit print my_array[0, :] drucken, die Antwort, die ich erhalten, ist ['C', 'A'], was eindeutig nicht die erwartete Ausgabe von Cat und Apple ist. Warum ist das so, und wie kann ich die richtige Ausgabe erhalten?

Danke!

Antwort

28

Numpy benötigt String-Arrays mit einer festen maximalen Länge. Wenn Sie ein leeres Array mit dtype=str erstellen, wird diese maximale Länge standardmäßig auf 1 festgelegt. Sie können sehen, ob Sie my_array.dtype tun; Es wird "| S1" angezeigt, was "Ein-Zeichen-String" bedeutet. Nachfolgende Zuweisungen in das Array werden abgeschnitten, um zu dieser Struktur zu passen.

Sie können einen expliziten Datentyp mit maximaler Länge, indem Sie, z.B .: passieren

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

Der „S10“ wird eine Reihe von Länge-10-Strings erstellen. Sie müssen entscheiden, wie groß groß genug sein wird, um alle Daten zu speichern, die Sie halten möchten.

+0

Das ist richtig, gut zu wissen! Danke – Jim

+0

Sobald ich ein Element in der Liste (d. H. 'My_array [0] = 'hallo'') aktualisiere, hat dieses erste Element noch" 10-stelligen "Speicher zugewiesen? Oder ist es jetzt wirklich ein "S5" -Objekt? Ich nehme nicht an, da der 'dtype' eines' numpy' Arrays über das gesamte Array hinweg konsistent sein muss. – Anonymous

+0

@jphollowed: Richtig, die Größe ist für das gesamte Array festgelegt. Wenn Sie es also als S10 initialisieren, verbraucht es immer noch 10 Byte für jeden Eintrag, auch wenn die tatsächlichen Zeichenfolgen, die Sie speichern, kleiner sind. – BrenBarn

2

Ich habe einen „Codec Fehler“, wenn ich mit dtype="S10"

ein Nicht-ASCII-Zeichen zu verwenden, auch versucht, ein Array mit Binärketten Sie erhalten, was mich verwirrte.

Ich denke, es ist besser zu nutzen:

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

1

Der numpy String-Array durch seine feste Länge (Länge 1 als Standard) begrenzt ist. Wenn Sie unsicher sind, welche Länge Sie für Ihre Strings im Voraus benötigen, können Sie dtype=object verwenden und beliebige Zeichenfolgen für Ihre Datenelemente erhalten:

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

ich es verstehen Effizienz Nachteile dieser Ansatz sein kann, aber Ich habe keinen guten Hinweis darauf, das zu unterstützen.

+0

gibt es irgendwelche Vorbehalte (wie langsamere Geschwindigkeit) im Vergleich zu, sagen wir mal "S10"? – Boern

0

Eine weitere Alternative ist wie folgt zu initialisieren:

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

Mit anderen Worten, zuerst Sie eine regelmäßige Anordnung schreiben mit, was Sie wollen, dann sind Sie es in ein numpy Array drehen. Dadurch wird jedoch die maximale Zeichenfolgenlänge bei der Initialisierung auf die Länge der längsten Zeichenfolge festgelegt. Wenn Sie also

my_array[1,0] = 'PINEAPPLE' 

hinzufügen, dann wäre die gespeicherte Zeichenfolge "PINEA".