2015-05-11 2 views
11
numpy.ndarray zurück

Ich bin hier ein wenig Schwierigkeiten haben,Konvertieren eines numpy.ndarray auf String (oder Bytes) und wandeln es

Ich versuche, eine numpy.ndarray zu Zeichenfolge zu konvertieren, ich hab schon das so gemacht:

randomArray.tostring() 

es funktioniert, aber ich frage mich, ob ich es wieder zu einem numpy.ndarray verwandeln kann.

Was ist der beste Weg, dies zu tun?

ich numpy bin mit 1.8.1

Kontext: Das Ziel ist es, die numpy.ndarray als Nachricht in rabbitmq zu senden (pika Bibliothek)

+0

Sie könnten diese Antwort hilfreich: [1]: http://stackoverflow.com/questions/5387208/convert-a-string-to-an- Array – Singularity

+0

Leider gibt die tostring() -Methode Bytes zurück und ich weiß nicht, wie man es selbst mit dieser Lösung konvertieren kann. – Ampo

Antwort

10

Sie können den vonString() -Methode verwenden:

arr =np.array([1,2,3,4,5,6]) 
ts = arr.tostring() 
print np.fromstring(ts,dtype=int) 

>>>[1 2 3 4 5 6] 

Entschuldigung für die kurze Antwort, nicht genug Punkte für das Kommentieren. Denken Sie daran, die Datentypen anzugeben oder Sie werden in einer Welt der Schmerzen enden.

+1

Ich wusste nicht über 'fromstring', nett! Es scheint jedoch keine mehrdimensionalen Arrays zu verwenden (gibt eine "flache" Version des mehrdimensionalen Arrays zurück). Ich nehme an, Sie können das Array später umgestalten, wenn Sie die Dimensionen kennen. –

+0

Das mag funktionieren, das Seltsame ist, dass meine 'tostring()' Methode seltsame Dinge (Bytes?) Zurückgibt, die 'fromstring()' funktioniert nicht perfekt. – Ampo

+0

@Ampo Sie können repr (ts) verwenden, um die Binärdatei anzuzeigen, aber Sie müssen es mit np.fromstring (ts, dtype = int) konvertieren, denken Sie daran, den richtigen Datentyp zu verwenden. Verwenden Sie Floats oder Ganzzahlen? Veröffentlichen Sie den Array-Typ, den Sie senden möchten. – ajsp

3

Stellen Sie sich vor Sie haben eine Reihe von numpy Ganzzahlen (es funktioniert mit anderen Typen, aber Sie brauchen ein paar leichte Änderungen). Sie können dies tun:

a = np.array([0, 3, 5]) 
a_str = ','.join(str(x) for x in a) # '0,3,5' 
a2 = np.array([int(x) for x in a_str.split(',')]) # np.array([0, 3, 5]) 

Wenn Sie ein Array von float haben, sollten Sie int von float in der letzten Zeile zu ersetzen.

Sie können auch die __repr__() Methode verwenden, die den Vorteil haben, werden für mehrdimensionale Arrays zu arbeiten:

from numpy import array 
numpy.set_printoptions(threshold=numpy.nan) 
a = array([[0,3,5],[2,3,4]]) 
a_str = a.__repr__() # 'array([[0, 3, 5],\n  [2, 3, 4]])' 
a2 = eval(a_str) # array([[0, 3, 5], 
       #  [2, 3, 4]]) 
+0

Da ich ein 3D-Array (Bild) verwende, sollte die '__repr __()' Methode funktionieren, tut es aber nicht. Das Array ist wirklich groß (1000000+ Werte drin) Ich habe am Ende 1000 Werte, nachdem ich es mit '__repr __()' konvertiert habe und 'eval()' stürzt ab (?) – Ampo

+0

@Ampo ja, __repr __() stürzt mit größeren Arrays ab der Darstellung von großen numpigen Arrays (große Arrays haben '...' anstelle von vollständigen Arrays). Sie können dieses Verhalten ändern (mit set_printoptions) ... Ich habe gerade meine Antwort bearbeitet, um zu sehen, ob das besser funktioniert. –

9

Wenn Sie tostring Sie verlieren Informationen sowohl über Form und Datentyp:

>>> import numpy as np 
>>> a = np.arange(12).reshape(3, 4) 
>>> a 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
>>> s = a.tostring() 
>>> aa = np.fromstring(a) 
>>> aa 
array([ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324, 
     1.48219694e-323, 1.97626258e-323, 2.47032823e-323, 
     2.96439388e-323, 3.45845952e-323, 3.95252517e-323, 
     4.44659081e-323, 4.94065646e-323, 5.43472210e-323]) 
>>> aa = np.fromstring(a, dtype=int) 
>>> aa 
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) 
>>> aa = np.fromstring(a, dtype=int).reshape(3, 4) 
>>> aa 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

Dies bedeutet, dass Sie die Metadaten zusammen mit den Daten an den Empfänger zu senden. Um die automatische konsistente Objekte austauschen, versuchen cPickle:

>>> import cPickle 
>>> s = cPickle.dumps(a) 
>>> cPickle.loads(s) 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
+0

dtype wichtig: 'np.uint8' /' np.uint16' – mertyildiran

Verwandte Themen