Jak przekonwertować tablicę ciągów na tablicę wartości zmiennoprzecinkowych w numpy?

117

Jak konwertować

["1.1", "2.2", "3.2"]

do

[1.1, 2.2, 3.2]

w NumPy?

Meh
źródło

Odpowiedzi:

179

Cóż, jeśli czytasz dane jako listę, po prostu zrób np.array(map(float, list_of_strings))(lub równoważnie, użyj rozumienia listy). (W Pythonie 3, trzeba zadzwonić listna mapwartości zwracanej, jeśli używasz map, ponieważ mapzwraca iterator teraz).

Jeśli jednak jest to już numeryczna tablica ciągów, jest lepszy sposób. Użyj astype().

import numpy as np
x = np.array(['1.1', '2.2', '3.3'])
y = x.astype(np.float)
Joe Kington
źródło
a jeśli masz tablicę z ciągiem, którą chcę zachować? jak ['a', '1.1', '2.2', '3.3'] -> ['a', 1.1,2.2,3.3]
ePascoal
8
@MrMartin - Następnie użyj pliku list. Numpy tablice są celowo jednorodnie wpisywane. Jeśli naprawdę chcesz, możesz użyć tablicy obiektów (np np.array(['apple', 1.2, 1, {'b'=None, 'c'=object()}], dtype=object).). Jednak tablice obiektów nie mają żadnych znaczących zalet w porównaniu z używaniem listy.
Joe Kington
4

Możesz również tego użyć

import numpy as np
x=np.array(['1.1', '2.2', '3.3'])
x=np.asfarray(x,float)
pradeep bisht
źródło
3

Inną opcją może być numpy.asarray :

import numpy as np
a = ["1.1", "2.2", "3.2"]
b = np.asarray(a, dtype=np.float64, order='C')

W przypadku Pythona 2 *:

print a, type(a), type(a[0])
print b, type(b), type(b[0])

w wyniku:

['1.1', '2.2', '3.2'] <type 'list'> <type 'str'>
[1.1 2.2 3.2] <type 'numpy.ndarray'> <type 'numpy.float64'>
Inżynier Herpes Free
źródło
1
Testowałem wszystkie odpowiedzi tutaj w Pythonie 2.7. Zakładając, że otrzymałem listę 512 ciągów, które reprezentują liczby zmiennoprzecinkowe, to podejście było najszybsze (nieco szybsze niż odpowiedź pradeepa bishta, około 1,5 razy szybsze niż odpowiedź Thomio i ponad dwukrotnie szybsze niż zaakceptowana odpowiedź). Głosuj za!
jodag
2

Jeśli masz (lub tworzysz) pojedynczy ciąg, możesz użyć np.fromstring :

import numpy as np
x = ["1.1", "2.2", "3.2"]
x = ','.join(x)
x = np.fromstring( x, dtype=np.float, sep=',' )

Uwaga, x = ','.join(x)przekształca tablicę x na ciąg '1.1, 2.2, 3.2'. Jeśli czytasz wiersz z pliku txt, każda linia będzie już ciągiem.

Thomio
źródło