2015-05-11 9 views
11

Mam mały problem tuKonwersja numpy.ndarray do sznurka (lub bajtów) i przekształcić ją z powrotem do numpy.ndarray

Próbuję przekonwertować numpy.ndarray ciąg I” Wcześniej już zrobić, że tak:

randomArray.tostring() 

to działa, ale zastanawiam się, czy mogę przekształcić go z powrotem do numpy.ndarray.

Jaki jest najlepszy sposób na zrobienie tego?

Używam NumPy 1.8.1

Kontekst: Celem jest, aby wysłać numpy.ndarray jako komunikat w RabbitMQ (pika biblioteki)

+0

Można znaleźć tę odpowiedź za przydatne: [1]: http://stackoverflow.com/questions/5387208/convert-a-string-to-an- array – Singularity

+0

Niestety metoda tostring() zwraca bajty i nie wiem, jak ją przekonwertować, nawet z tym rozwiązaniem. – Ampo

Odpowiedz

10

Można użyć metody fromstring() dla tego:

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

>>>[1 2 3 4 5 6] 

Przepraszamy za krótką odpowiedź, za mało punktów do komentowania. Pamiętaj, aby podać typy danych, a skończysz w świecie bólu.

+1

Nie wiedziałem o "odstringu", miło! nie wydaje się jednak działać wielowymiarowych tablic (zwraca "płaską" wersję tablicy wielowymiarowej). Sądzę, że możesz zmienić kształt tablicy, jeśli znasz wymiary. –

+0

To może zadziałać, dziwne jest to, że moja metoda 'tostring()' zwraca dziwne rzeczy (bajty?), 'Odstring()' nie działa idealnie. – Ampo

+0

@Ampo możesz użyć repr (ts), aby wyświetlić plik binarny, ale będziesz musiał go przekonwertować używając np.fromstring (ts, dtype = int), pamiętaj, aby użyć poprawnego typu danych. Czy używasz liczb zmiennoprzecinkowych lub liczb całkowitych? Opublikuj typ tablicy, którą próbujesz wysłać. – ajsp

3

Imagine masz numpy tablicę liczby całkowite (działa z innymi typami, ale potrzebujesz drobnej modyfikacji). Można to zrobić:

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

Jeśli masz tablicę pływaka, należy wymienić int przez float w ostatnim wierszu.

Można również użyć metody __repr__(), co będzie miało tę zaletę, że działa dla tablic wielowymiarowych:

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

Ponieważ używam 3D-Array (obrazu), metoda '__repr __()' powinna działać, ale nie działa. Tablica jest naprawdę duża (1000000 wartości w niej) kończę z wartościami 1000 po konwersji na '__repr __()' i 'eval()' crashes (?) – Ampo

+0

@Ampo yes, __repr __() zawiesza się na większych tablicach, ponieważ reprezentacji dużych tablic typu numpy (duże tablice mają "..." zamiast pełnych tablic). Możesz zmienić to zachowanie (z set_printoptions) ... Właśnie zmieniłem swoją odpowiedź, zobacz, czy to działa lepiej. –

9

Jeśli używasz tostring tracisz informacje zarówno na kształt i danych typu:

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

Oznacza to, że trzeba wysłać metadanych wraz z danymi do odbiorcy. Aby wymienić auto-spójne przedmioty, spróbuj 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 important: 'np.uint8' /' np.uint16' – mertyildiran

Powiązane problemy