2012-12-05 8 views
15

Mam pewne pozornie banalne problemy z numpy, gdy tablica zawiera dane ciągu. Mam następujący kod:Dziwne zachowanie inicjujące szeregową tablicę danych łańcuchowych

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

Teraz, kiedy go wydrukować z print my_array[0, :], odpowiedź pojawia się ['C', 'A'], co oczywiście nie jest oczekiwana produkcja skór z kotów i Apple. Dlaczego tak jest i jak mogę uzyskać odpowiedni wynik?

Dzięki!

Odpowiedz

28

Numpy wymaga macierzy ciągów, aby mieć ustaloną maksymalną długość. Kiedy tworzysz pustą tablicę z dtype=str, domyślnie ustawia ona maksymalną długość na 1. Możesz zobaczyć, czy wykonujesz my_array.dtype; wyświetli "| S1", co oznacza "ciąg jednoznakowy". Kolejne przypisania do tablicy są obcinane, aby pasowały do ​​tej struktury.

można przekazać wyraźny typ danych z maksymalną długością przez działanie, np .:

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

The „S10” stworzy tablicę długości 10 strun. Musisz zdecydować, jak duże będą wystarczająco duże, aby pomieścić wszystkie dane, które chcesz zatrzymać.

+0

To prawda, dobrze wiedzieć! Dzięki – Jim

+0

Po aktualizacji elementu na liście (np. My_array [0] = 'hello''), czy ten pierwszy element nadal ma "10-znakową wartość" przydzielonej pamięci? Czy może jest to teraz obiekt "S5"? Zakładam, że nie, ponieważ tablica 'dtype' tablicy 'numpy' musi być spójna w całej tablicy? – Anonymous

+0

@jphollowed: W prawo, rozmiar jest ustalony dla całej tablicy, więc jeśli zainicjujesz go jako S10, nadal będzie zużywał 10 bajtów dla każdego wpisu, nawet jeśli rzeczywiste łańcuchy, które przechowujesz, są mniejsze. – BrenBarn

2

mam kodeka „błąd”, gdy próbowałem użyć znaku spoza ASCII z dtype="S10"

również uzyskać tablicę z ciągów binarnych, który mylić mnie.

myślę, że lepiej jest użyć:

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

1

numpy tablicy ciąg znaków jest ograniczona przez jego stałej długości (długość domyślnie 1). Jeśli nie masz pewności co długość trzeba dla strun z góry, można użyć dtype=object i uzyskać dowolne ciągi długości dla elementów danych:

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

Rozumiem, że mogą być wady efektywności tego podejścia, ale Nie mam dobrego odniesienia do tego wsparcia.

+0

Czy są jakieś zastrzeżenia (takie jak mniejsza prędkość) w porównaniu do, powiedzmy "S10"? – Boern

0

Inną alternatywą jest zainicjować w następujący sposób:

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

Innymi słowy, najpierw piszesz regularną tablicę z tego, co chcesz, a następnie przekształcić go w numpy tablicy. Jednak spowoduje to naprawienie maksymalnej długości łańcucha na długość najdłuższego łańcucha podczas inicjowania. Więc jeśli były, aby dodać

my_array[1,0] = 'PINEAPPLE' 

następnie ciąg przechowywane byłoby „PINEA”.