2015-05-11 12 views
11

Sto avendo un po 'di problemi qui,Convertire un numpy.ndarray a stringa (o byte) e riconvertirlo in numpy.ndarray

Sto cercando di convertire un numpy.ndarray a stringa, I' ve già fatto in questo modo:

randomArray.tostring() 

funziona, ma mi chiedo se posso trasformarlo di nuovo ad un numpy.ndarray.

Qual è il modo migliore per farlo?

sto usando NumPy 1.8.1

Contesto: L'obiettivo è quello di inviare il numpy.ndarray come un messaggio in RabbitMQ (Pika biblioteca)

+0

Si può trovare questa risposta utile: [1]: http://stackoverflow.com/questions/5387208/convert-a-string-to-an- array – Singularity

+0

Purtroppo il metodo tostring() restituisce i byte e non so come convertirlo anche con questa soluzione. – Ampo

risposta

10

È possibile utilizzare il metodo fromstring() per questo:

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

>>>[1 2 3 4 5 6] 

Ci scusiamo per la risposta breve, non abbastanza punti per commentare. Ricorda di indicare i tipi di dati o finirai in un mondo di dolore.

+1

non sapevo di 'fromstring', bello! tuttavia, non sembra funzionare matrici multidimensionali (restituisce una versione "piatta" dell'array multidimensionale). Immagino che tu possa rimodellare l'array in seguito se conosci le dimensioni. –

+0

Questo potrebbe funzionare, la cosa strana è che il mio metodo 'tostring()' restituisce cose strane (byte?) Il 'fromstring()' non funziona perfettamente. – Ampo

+0

@Ampo è possibile utilizzare repr (ts) per visualizzare il file binario, ma sarà necessario convertirlo utilizzando np.fromstring (ts, dtype = int), ricordarsi di utilizzare il tipo di dati corretto. Stai usando float o interi? Pubblica il tipo di array che stai tentando di inviare. – ajsp

3

Immaginate di avere una serie di NumPy interi (funziona con altri tipi ma è necessaria una leggera modifica). È possibile farlo:

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

Se si dispone di una serie di galleggiante, accertarsi di sostituire int dal float nell'ultima riga.

È anche possibile utilizzare il metodo __repr__(), che avrà il vantaggio di lavorare per array multidimensionali:

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

Dal momento che utilizzo una matrice 3D (immagine) il metodo '__repr __()' dovrebbe funzionare ma non lo fa. L'array è veramente grande (con più di 1000000 valori) Finisco con 1000 valori dopo averlo convertito con '__repr __()' e 'eval()' si blocca (?) – Ampo

+0

@Ampo sì, __repr __() si blocca con array più grandi perché della rappresentazione di grandi array numpy (gli array di grandi dimensioni hanno '...' invece di array completi). È possibile modificare tale comportamento (con set_printoptions) ... Ho appena modificato la mia risposta, vedere se funziona meglio. –

9

Se si utilizza tostring si perde informazioni su entrambi forma e tipo di dati:

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

Questo significa che dovete inviare i metadati insieme ai dati al destinatario. Per scambiare gli oggetti auto-consistente, provare 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: 'np.uint8' /' np.uint16' – mertyildiran

Problemi correlati