2012-02-02 10 views
15

Czy jest możliwe zainicjowanie powtarzającego się powtarzania, które będzie zawierać ciągi znaków, nie znając wcześniej długości łańcuchów?powtarzające się ciągi o zmiennej długości

Jako (contrived) przykład:

mydf = np.empty((numrows,), dtype=[ ('file_name','STRING'), ('file_size_MB',float) ]) 

Problem polega na tym, że mam konstruowania mój recarray wyprzedzeniem wypełniania jej informacji, a nie koniecznie znać maksymalną długość file_name z góry .

Wszystkie moje próby spowodować dziedzinie strun jest obcięty:

>>> mydf = np.empty((2,), dtype=[('file_name',str),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('', 6.9164002347457e-310), ('', 9.9413127e-317)], 
     dtype=[('file_name', 'S'), ('file_size_mb', '<f8')]) 
>>> mydf['file_name'] 
array(['f', 'a'], 
     dtype='|S1') 

(Tak na marginesie, dlaczego mydf['file_name'] pokaz 'F' i 'A', natomiast mydf pokazy '' i ''?)

Podobnie, jeśli zainicjować z rodzaju (powiedzmy) |S10 dla file_name potem robi się obcięty na długość 10.

jedynym podobne pytanie udało mi się znaleźć to this one, ale to obli znosi odpowiednią długość ciągu a priori, a zatem nie jest dokładnie taka sama jak moja (ponieważ nie wiem z góry).

Czy jest jakaś alternatywa inna niż zainicjowanie file_name z (np.) |S9999999999999 (tj. Jakiś śmieszny górny limit)?

+0

To jest dobre pytanie. długość 0 struny w rekolekcjach właśnie kazał mi wyrywać włosy na pół godziny! – Christoph

Odpowiedz

24

Zamiast używać dtypu STRING, zawsze można użyć object jako typ dtype. Umożliwi to przypisanie dowolnego obiektu do elementu tablicy, w tym łańcuchów o zmiennej długości Python. Na przykład:

>>> import numpy as np 
>>> mydf = np.empty((2,), dtype=[('file_name',object),('file_size_mb',float)]) 
>>> mydf['file_name'][0]='foobarasdf.tif' 
>>> mydf['file_name'][1]='arghtidlsarbda.jpg' 
>>> mydf 
array([('foobarasdf.tif', 0.0), ('arghtidlsarbda.jpg', 0.0)], 
     dtype=[('file_name', '|O8'), ('file_size_mb', '<f8')]) 

Jest sprzeczne z duchem koncepcji tablicowej, aby mieć elementy o zmiennej długości, ale jest to tak blisko, jak tylko można. Ideą tablicy jest to, że elementy są przechowywane w pamięci przy dobrze zdefiniowanych i regularnie rozmieszczonych adresach pamięci, co zabrania elementów o zmiennej długości. Przechowując wskaźniki w łańcuchu, można ominąć to ograniczenie. (Zasadniczo jest to powyższy przykład).

+0

dziękuję za to - po prostu zmieniam język z R i chciałem czegoś w rodzaju ramki danych, a to działa świetnie! –

+3

Późny komentarz: jeśli poruszasz się z R, rozważ obiekt pandas.DataFrame, który powinien wydawać ci się bardzo znajomy i dobrze obsługiwać ciągi. – mdurant

Powiązane problemy