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 elemento sabio de concatenación de cadenas. Pensé en Agregar() era la manera de hacerlo en numpy, pero, obviamente, no está funcionando como se esperaba.

  • Como implica el nombre, el número es el de los números. El propio Python tiene bastante buena cadena de operaciones. Por qué no usar simplemente que? "".join(["a", "b"]) funciona bien.
  • Estaba buscando en este docs.scipy.org/doc/numpy/reference/routines.char.html
  • Eso es genial. Pero: «a Todos ellos se basan en la cadena de métodos en la biblioteca estándar de Python.». Así que si usted sólo tiene que utilizar la biblioteca estándar se puede escribir código que no depende de numpy.
  • El add operación no hacer la misma cosa como join. numpy a añadir puede ser útil para multidimensionales los arrays o listas anidadas.
  • ¿Dónde add vienen?
InformationsquelleAutor Dave31415 | 2012-03-31

5 Comentarios

  1. 46

    Esto se puede hacer utilizando numpy.núcleo.defchararray.agregar. Aquí está 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 operaciones de cadena disponible para NumPy tipos de datos.

    • El add operaciones de cadena enlace da un NotImplemented (como en la pregunta) para numpy 1.6.1 en python 3.2. ¿Sabe usted de qué versión se implementa?
    • la comprobación con que versión de combinación en Ubuntu 12.04.2 LTS, el ejemplo en mi respuesta funciona como se esperaba. Hablando en general, el uso de np.add también plantea NotImplemented con cualquier versión. Asegúrese de que está utilizando np.core.defchararray.add.
    • Ahora he visto la firma completa de add en el docs (que me perdí que antes). De todos modos, sería bueno si numpy envolvió np.core.defchararray.* en numérica correspondiente ndarray operaciones. Creo que es mucho más limpio y fácil de recordar para hacer np.add.
    • Como se señaló en el docstring del módulo, «el preferido de alias para defchararray es numpy.char«, por lo que sólo puede decir np.char.add.
    • Es posible definir un delimitador para obtener una salida como array([‘a#E’, ‘b#F’]) ? Btw, gracias por la solución anterior. Usa el mapa(‘#’.únete a, código postal(a1, a2)) yo puedo, pero la curiosidad es posible con numpy.
  2. 10

    Usted puede utilizar el chararray subclase para realizar la matriz de operaciones con cadenas de caracteres:

    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')
    • A partir de la documentación, «no se recomienda para el nuevo desarrollo»
  3. 6

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

    >>> a1 = ['a','b']
    >>> a2 = ['E','F']
    >>> map(''.join, zip(a1, a2))
    ['aE', 'bF']
    • Ok, así que el complemento de la función a que estaba usando no está en el nivel superior en numpy. Es uno de los más rápido/mejor o preferido por alguna razón?
    • Esto no contesta la pregunta. Hay momentos en los que uno puede querer hacer esto en numpy, por ejemplo, cuando se trabaja con grandes conjuntos de cadenas. El cartel original dio un ejemplo simple de lo que uno podría usar Python puro, pero estaba pidiendo un numpy solución.
    • De lo que he entendido en el momento de escribir mi respuesta, numpy sólo utiliza el builtin Python primitivas, por lo que no veo qué ventaja que podría tener. No estoy seguro si esto es cierto, parece que no lo es. Tal vez se me malinterprete, la afirmación «Todos ellos están basados en la cadena de métodos en la biblioteca estándar de Python.» en el docs
    • Gracias, Nick. Yo estaba buscando exactamente lo mismo. Solo por curiosidad, ¿cómo se puede implementar el mismo uso de numpy. Voy a cavar numpy docs.
  4. 1

    Otra solución es convertir la cadena de matrices en las matrices de python de los objetos para que str.agregar 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)

    Este no es lento (menos de dos veces tan lento como la adición de matrices de enteros).

  5. 1

    Uno de los más básicos, elegante y rápida solución:

    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 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)

Dejar respuesta

Please enter your comment!
Please enter your name here