web-dev-qa-db-fra.com

Concaténation de chaînes élémentaire dans numpy

Est-ce un bug?

import numpy as np
a1=np.array(['a','b'])
a2=np.array(['E','F'])

In [20]: add(a1,a2)
Out[20]: NotImplemented

J'essaie de faire la concaténation de chaînes d'éléments. Je pensais que Add () était le moyen de le faire numpy mais évidemment cela ne fonctionne pas comme prévu. 

20
Dave31415

Cela peut être fait en utilisant numpy.core.defchararray.add . Voici un exemple:

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

Il existe d'autres opérations utiles string disponibles pour les types de données NumPy.

38
Mike T

Vous pouvez utiliser la sous-classe chararray pour effectuer des opérations sur des tableaux avec des chaînes:

a1 = np.char.array(['a', 'b'])
a2 = np.char.array(['E', 'F'])

a1 + a2
#chararray(['aE', 'bF'], dtype='|S2')

un autre bel exemple:

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

Cela peut (et devrait) être fait en Python pur, car numpy utilise également les fonctions de manipulation de chaînes Python en interne:

>>> a1 = ['a','b']
>>> a2 = ['E','F']
>>> map(''.join, Zip(a1, a2))
['aE', 'bF']
6
Niklas B.

Une autre solution consiste à convertir des tableaux de chaînes en tableaux de python d’objets de manière à ce que str.add soit appelée:

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

Ce n'est pas si lent (moins de deux fois plus lent que l'ajout de tableaux d'entiers).

1
jonathanrocher

Encore une solution basique, élégante et rapide:

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

C'est très rapide pour les petits tableaux. 

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)

Pour les tableaux de grande taille, le décalage horaire n’est pas considérable.

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)
0
Gaurav Singhal