array python arrays string numpy elementwise-operations

python - numpy array operations



Concatenación de cuerdas de elementos en número (5)

Esto puede (y debe) hacerse en Python puro, ya que numpy también usa internamente las funciones de manipulación de cadenas de Python:

>>> a1 = [''a'',''b''] >>> a2 = [''E'',''F''] >>> map(''''.join, zip(a1, a2)) [''aE'', ''bF'']

¿Es esto un error?

import numpy as np a1=np.array([''a'',''b'']) a2=np.array([''E'',''F'']) In [20]: add(a1,a2) Out[20]: NotImplemented

Estoy tratando de hacer concatenación de cadenas de elementos sabios. Pensé que Add () era la forma de hacerlo en números, pero obviamente no está funcionando como se esperaba.


Esto se puede hacer usando numpy.core.defchararray.add . Aquí hay un ejemplo:

>>> import numpy as np >>> a1 = np.array([''a'', ''b'']) >>> a2 = np.array([''E'', ''F'']) >>> np.core.defchararray.add(a1, a2) array([''aE'', ''bF''], dtype=''<U2'')

Hay otras operaciones de cadena útiles disponibles para los tipos de datos NumPy.


Otra solución es convertir los arreglos de cadenas en arreglos de python de objetos para que se llame a str.add:

>>> import numpy as np >>> a = np.array([''a'', ''b'', ''c'', ''d''], dtype=np.object) >>> print a+a array([''aa'', ''bb'', ''cc'', ''dd''], dtype=object)

Esto no es tan lento (menos del doble de lento que agregar matrices de enteros).


Una solución más básica, elegante y rápida:

In [11]: np.array([x1 + x2 for x1,x2 in zip(a1,a2)]) Out[11]: array([''aE'', ''bF''], dtype=''<U2'')

Es muy rápido para matrices más pequeñas.

In [12]: %timeit np.array([x1 + x2 for x1,x2 in zip(a1,a2)]) 3.67 µs ± 136 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) In [13]: %timeit np.core.defchararray.add(a1, a2) 6.27 µs ± 28.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) In [14]: %timeit np.char.array(a1) + np.char.array(a2) 22.1 µs ± 319 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Para matrices más grandes, la diferencia de tiempo no es mucho.

In [15]: b1 = np.full(10000,''a'') In [16]: b2 = np.full(10000,''b'') In [189]: %timeit np.array([x1 + x2 for x1,x2 in zip(b1,b2)]) 6.74 ms ± 66.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) In [188]: %timeit np.core.defchararray.add(b1, b2) 7.03 ms ± 419 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) In [187]: %timeit np.char.array(b1) + np.char.array(b2) 6.97 ms ± 284 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


Puede usar la subclase chararray para realizar operaciones de matriz con cadenas:

a1 = np.char.array([''a'', ''b'']) a2 = np.char.array([''E'', ''F'']) a1 + a2 #chararray([''aE'', ''bF''], dtype=''|S2'')

otro buen ejemplo:

b = np.array([2, 4]) a1*b #chararray([''aa'', ''bbbb''], dtype=''|S4'')