2012-03-31 16 views
17

¿Esto es un error?Concatenación de cadenas a nivel de elemento en numpy

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 la concatenación de cadenas de elemento. Pensé que Add() era la forma de hacerlo en numpy, pero obviamente no funciona como se esperaba.

+1

Como su nombre lo indica, es el número de números. Python tiene muy buenas operaciones de cadena. ¿Por qué no usar eso? '" ".join ([" a "," b "])' funciona bien. – Keith

+1

Estaba viendo este http://docs.scipy.org/doc/numpy/reference/routines.char.html – Dave31415

+2

Eso es genial. Pero: "Todos ellos se basan en los métodos de cadena en la biblioteca estándar de Python". Entonces, si solo usa la biblioteca estándar, puede escribir código que no dependa de numpy. – Keith

Respuesta

30

Esto se puede hacer usando numpy.core.defchararray.add. He aquí 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 otros útiles string operations disponible para los tipos de datos NumPy.

+0

Las operaciones de cadenas 'add' a las que enlazas dan un' NotImplemented' (como en la pregunta) para numpy 1.6.1 bajo python 3.2. ¿Sabes de qué versión se implementa? –

+0

@FrancescoMontesano comprobando con esa combinación de versión en Ubuntu 12.04.2 LTS, el ejemplo en mi respuesta funciona como se esperaba. En términos generales, el uso de 'np.add' también aumenta' NotImplemented' con cualquier versión. Asegúrese de estar utilizando 'np.core.defchararray.add'. –

+0

Ahora he visto la firma completa de 'agregar' en los documentos (me perdí eso antes). De todos modos, sería bueno si numpy envolvería 'np.core.defchararray. *' En las operaciones numéricas ndarray correspondientes. Creo que es mucho más ordenado y fácil de recordar que hacer 'np.add'. –

4

Esto puede (y debe) ser hecho en Python puro, como numpy también utiliza las funciones de manipulación de cadenas de Python internamente:

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

Ok, entonces la función de agregar que estaba usando no está en el nivel superior en numpy. ¿Alguno de estos es más rápido/mejor o preferido por alguna razón? – Dave31415

+7

Esto no responde la pregunta. Hay momentos en los que uno podría querer hacer esto en numpy, p. cuando se trabaja con grandes conjuntos de cadenas. El cartel original dio un ejemplo simple para el cual uno usaría Python puro, pero estaba pidiendo una solución numpy. – Thucydides411

+0

@ Thucydides411 Por lo que entendí en el momento de escribir mi respuesta, Numpy acaba de utilizar los primitivos incorporados de Python, por lo que no vi qué ventaja tendría. No estoy seguro de si eso es cierto, parece que no es así. Tal vez malinterpreté la afirmación "Todos ellos se basan en los métodos de cadena en la biblioteca estándar de Python". en los documentos –

1

Otra solución es convertir matrices de cadenas en matrices de pitón de objetos de modo que str.add se llama:

>>> 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 lenta (menos de dos veces tan lenta como la adición de matrices de enteros).

7

You can use the chararray subclass para realizar operaciones de matriz de 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') 
+0

De los documentos, _ "no se recomienda para un nuevo desarrollo" _ – Eric

Cuestiones relacionadas