Manera eficiente de convertir una cadena separada por delimitador a una matriz numpy

Tengo una cadena de la siguiente manera:

1|234|4456|789 

Tengo que convertirlo en una matriz numpy. Me gustaría conocer la forma más eficiente. ¡Desde que llamaré a esta función más de 50 millones de veces!

La forma más rápida es usar el método numpy.fromstring :

 >>> import numpy >>> data = "1|234|4456|789" >>> numpy.fromstring(data, dtype=int, sep="|") array([ 1, 234, 4456, 789]) 

@jterrace gana un (1) internet.

En las siguientes medidas, el código de ejemplo se ha acortado para permitir que las pruebas encajen en una línea sin desplazarse cuando sea posible.

Para aquellos que no están familiarizados con timeit el indicador -s permite especificar un bit de código que solo se ejecutará una vez .


La forma más rápida y menos abarrotada es usar numpy.fromstring como jterrace sugirió:

 python -mtimeit -s"import numpy;s='1|2'" "numpy.fromstring(s,dtype=int,sep='|')" 100000 loops, best of 3: 1.85 usec per loop 

Los siguientes tres ejemplos usan string.split en combinación con otra herramienta.

string.split con numpy.fromiter

 python -mtimeit -s"import numpy;s='1|2'" "numpy.fromiter(s.split('|'),dtype=int)" 100000 loops, best of 3: 2.24 usec per loop 

string.split con int() emitido a través de expresión-generador

 python -mtimeit -s"import numpy;s='1|2'" "numpy.array(int(x) for x in s.split('|'))" 100000 loops, best of 3: 3.12 usec per loop 

string.split con matriz NumPy de tipo int

 python -mtimeit -s"import numpy;s='1|2'" "numpy.array(s.split('|'),dtype=int)" 100000 loops, best of 3: 9.22 usec per loop 

Prueba esto:

 import numpy as np s = '1|234|4456|789' array = np.array([int(x) for x in s.split('|')]) 

… Suponiendo que los números son todos ints. si no, reemplace int con float en el fragmento de código anterior.

EDITAR 1:

Alternativamente, puede hacer esto, solo creará una lista intermedia (la generada por split() ):

 array = np.array(s.split('|'), dtype=int) 

EDIT 2:

Y aún de otra manera, posiblemente más rápido (¡Gracias por todos los comentarios, chicos!):

 array = np.fromiter(s.split("|"), dtype=int)