2012-03-31 12 views
18

Próbuje przekonwertować int tablic do tablic ciągów w numpyKonwersja int tablic do tablic ciągów w numpy bez obcięcia

In [66]: a=array([0,33,4444522]) 
In [67]: a.astype(str) 
Out[67]: 
array(['0', '3', '4'], 
     dtype='|S1') 

Nie to, co zamierzałem

In [68]: a.astype('S10') 
Out[68]: 
array(['0', '33', '4444522'], 
     dtype='|S10') 

To działa, ale musiałem wiedzieć 10 było wystarczająco duży, by pomieścić mój najdłuższy sznur. Czy istnieje sposób na zrobienie tego w łatwy sposób, nie wiedząc z wyprzedzeniem, jaki łańcuch wielkości potrzebujesz? Wydaje się nieco niebezpieczne, że po prostu po cichu obcina strunę bez rzucania błędu.

+0

Dla zwiedzających od 2018 roku i plany na przyszłość: 'a.astype (STR)' będzie teraz działać dokładnie według potrzeb. – Raketenolli

Odpowiedz

30

Ponownie, to może być rozwiązany w czystym Pythonie:

>>> map(str, [0,33,4444522]) 
['0', '33', '4444522'] 

Lub jeśli trzeba konwertować iz powrotem:

>>> a = np.array([0,33,4444522]) 
>>> np.array(map(str, a)) 
array(['0', '33', '4444522'], 
     dtype='|S7') 
+0

Dzięki. Chyba muszę się lepiej zapoznać z mapą. – Dave31415

2

można znaleźć najmniejszą wystarczającą szerokość tak:

In [3]: max(len(str(x)) for x in [0,33,4444522]) 
Out[3]: 7 

Alternatywnie, po prostu skonstruuj ndarray z listy ciągów:

In [7]: np.array([str(x) for x in [0,33,4444522]]) 
Out[7]: 
array(['0', '33', '4444522'], 
     dtype='|S7') 

lub korzystając map():

In [8]: np.array(map(str, [0,33,4444522])) 
Out[8]: 
array(['0', '33', '4444522'], 
     dtype='|S7') 
+0

Dla dużych tablic, 'map()' jest lepszą opcją niż zrozumienie listy, ponieważ popycha wykonanie kodu do C. –

+1

@JoelCornett Czasami 'mapa' może być nieco szybsza (w tym przykładzie jest około 3% szybsza niż używając ze zrozumieniem listy), ale nie zawsze tak jest, a rozumienie list jest uważane za bardziej pytonowe. Zobacz http://stackoverflow.com/a/1247490/1191119 – jorgeca

+2

@jorgeca: Absolutnie nie zawsze tak jest. Nawiasem mówiąc, podczas przeprowadzania badań natknąłem się na [ten pouczający artykuł] (http://www.python.org/doc/essays/list2str.html) autorstwa Guido. –

28

Można zatrzymać się w numpy, robi

np.char.mod('%d', a) 

Jest to dwa razy szybciej niż map lub listowych do 10 elementów, cztery razy szybciej 100. Ta i inne operacje na ciągach są dokumentowane here.

+0

Fajnie, ale nie mogę znaleźć dokumentacji tego, czy mógłbyś podać link, jeśli to możliwe? –

+0

@MikhailV Pewnie, właśnie dodałem link do odpowiedzi. – jorgeca

0

np.apply_along_axis(lambda y: [str(i) for i in y], 0, x)

Przykład

>>> import numpy as np 

>>> x = np.array([-1]*10+[0]*10+[1]*10) 
array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 

>>> np.apply_along_axis(lambda y: [str(i) for i in y], 0, x).tolist() 
['-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '0', '0', 
'0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', 
'1', '1', '1', '1'] 
Powiązane problemy