¿Cómo convertir una matriz de cadenas en una matriz de flotadores en numpy?

116

Cómo convertir

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

a

[1.1, 2.2, 3.2]

en NumPy?

Meh
fuente

Respuestas:

179

Bueno, si está leyendo los datos como una lista, simplemente hágalo np.array(map(float, list_of_strings))(o de manera equivalente, use una lista de comprensión). (En Python 3, necesitará llamar listal mapvalor de retorno si lo usa map, ya que mapahora devuelve un iterador).

Sin embargo, si ya es una gran variedad de cadenas, hay una mejor manera. Utilice astype().

import numpy as np
x = np.array(['1.1', '2.2', '3.3'])
y = x.astype(np.float)
Joe Kington
fuente
y si tiene una matriz con una cadena que quiero mantener? como ['a', '1.1', '2.2', '3.3'] -> ['a', 1.1,2.2,3.3]
ePascoal
8
@MrMartin: luego use un list. Las matrices numerosas se escriben deliberadamente de forma homogénea. Si realmente lo desea, puede usar una matriz de objetos (por ejemplo np.array(['apple', 1.2, 1, {'b'=None, 'c'=object()}], dtype=object)). Sin embargo, las matrices de objetos no tienen ventajas significativas sobre el uso de una lista.
Joe Kington
4

Puedes usar esto también

import numpy as np
x=np.array(['1.1', '2.2', '3.3'])
x=np.asfarray(x,float)
pradeep bisht
fuente
3

Otra opción podría ser numpy.asarray :

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

Para Python 2 *:

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

Resultando en:

['1.1', '2.2', '3.2'] <type 'list'> <type 'str'>
[1.1 2.2 3.2] <type 'numpy.ndarray'> <type 'numpy.float64'>
Ingeniero libre de herpes
fuente
1
Evalué todas las respuestas aquí en Python 2.7. Suponiendo que me dan una lista de 512 cadenas que representan números de punto flotante, este enfoque fue el más rápido (un poco más rápido que la respuesta de pradeep bisht, aproximadamente 1,5 veces más rápido que la respuesta de Thomio y más del doble de rápido que la respuesta aceptada). ¡Vota a favor!
jodag
2

Si tiene (o crea) una sola cadena, puede usar np.fromstring :

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

Tenga en cuenta que x = ','.join(x)transforma la matriz x en una cadena '1.1, 2.2, 3.2'. Si lee una línea de un archivo txt, cada línea ya será una cadena.

Thomio
fuente