2012-03-31 14 views
17

Ist das ein Fehler?Elementweise String-Verkettung in numpy

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

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

Ich versuche, Element-weise String-Verkettung zu tun. Ich dachte Add() war die Art, es in numpy zu tun, aber offensichtlich funktioniert es nicht wie erwartet.

+1

Wie der Name schon sagt, die Zahl ist für Zahlen. Python selbst hat ziemlich gute String-Operationen. Warum nicht einfach das benutzen? '" ".join ([" a "," b "])' funktioniert gut. – Keith

+1

Ich schaute auf diese http://docs.scipy.org/doc/numpy/reference/routines.char.html – Dave31415

+2

Das ist cool. Aber: "Alle basieren auf den String-Methoden in der Python-Standardbibliothek." Wenn Sie also nur die Standardbibliothek verwenden, können Sie Code schreiben, der nicht von numpy abhängt. – Keith

Antwort

30

Dies kann mit numpy.core.defchararray.add erfolgen. Hier ein Beispiel:

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

Es gibt andere nützliche string operations für NumPy Datentypen.

+0

Die 'add'-Zeichenfolgenoperationen, zu denen Sie eine Verknüpfung herstellen, geben ein 'NotImplemented' (wie in der Frage) für numpy 1.6.1 unter Python 3.2. Weißt du, von welcher Version ist das implementiert? –

+0

@FrancescoMontesano Prüfung mit dieser Version Kombination auf Ubuntu 12.04.2 LTS, das Beispiel in meiner Antwort funktioniert wie erwartet. Im Allgemeinen wird mit 'np.add' auch' NotImplemented' mit einer beliebigen Version ausgelöst. Stellen Sie sicher, dass Sie 'np.core.defchararray.add' verwenden. –

+0

Jetzt habe ich die vollständige Signatur von 'add' in den Dokumenten gesehen (das habe ich vorher verpasst). Wie auch immer, wäre schön, wenn numpy 'np.core.defchararray. *' In entsprechende numerische ndarray-Operationen einbinden würde. Ich denke, es ist viel besser und leichter zu erinnern, "np.add" zu machen. –

4

Dies kann (und sollte) in reinem Python getan werden, als numpy auch die String-Manipulation Funktionen Python intern verwendet:

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

Ok, also die Add-Funktion, die ich verwendet habe, ist nicht auf der obersten Ebene in numpy. Ist einer von denen schneller/besser oder aus irgendeinem Grund bevorzugt? – Dave31415

+7

Dies beantwortet die Frage nicht. Es gibt Zeiten, in denen man dies in einer Anzahl, z.B. wenn mit großen Arrays von Strings gearbeitet wird. Das ursprüngliche Poster gab ein einfaches Beispiel, für das man reines Python verwenden würde, aber er verlangte nach einer nüchternen Lösung. – Thucydides411

+0

@ Thucydides411 Von dem, was ich beim Schreiben meiner Antwort verstand, verwendete numpy nur die eingebauten Python-Primitive, also habe ich nicht gesehen, welchen Vorteil das hätte. Nicht sicher, ob das stimmt, scheint es nicht zu sein. Vielleicht habe ich die Aussage "Alle basieren auf den String-Methoden in der Python-Standardbibliothek" falsch interpretiert. in der Dokumentation –

1

Eine andere Lösung ist String-Arrays in Arrays von Python von Objekten zu konvertieren, so dass str.add genannt:

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

dies nicht, dass nur langsam (weniger als doppelt so langsam als Integer-Arrays hinzufügen).

7

You can use the chararray subclass zum Array-Operationen mit Strings ausführen:

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

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

ein weiteres schönes Beispiel:

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

Aus der Dokumentation, _ "es ist nicht für die Neuentwicklung empfohlen" _ – Eric