2015-05-11 2 views
11

У меня небольшая проблема здесь,Преобразование numpy.ndarray в строку (или байт) и преобразовать его обратно в numpy.ndarray

Я пытаюсь преобразовать numpy.ndarray в строку, я ве уже сделал это так:

randomArray.tostring() 

это работает, но мне интересно, если я могу преобразовать его обратно в numpy.ndarray.

Каков наилучший способ для этого?

Я использую Numpy 1.8.1

Контекст: Цель состоит в том, чтобы отправить numpy.ndarray как сообщение в RabbitMQ (пищуха библиотека)

+0

Вы могли бы найти этот ответ полезным: [1]: http://stackoverflow.com/questions/5387208/convert-a-string-to-an- array – Singularity

+0

К сожалению, метод tostring() возвращает байты, и я не знаю, как его преобразовать даже с этим решением. – Ampo

ответ

10

Вы можете использовать метод fromstring() для этого:

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

>>>[1 2 3 4 5 6] 

Извините за короткий ответ, недостаточно очков для комментариев. Не забудьте указать типы данных, иначе вы окажетесь в мире боли.

+1

Я не знал о 'fromstring', хорошо! однако он не работает многомерные массивы (возвращает «плоскую» версию многомерного массива). Я думаю, вы можете изменить массив после этого, если знаете размеры. –

+0

Это может сработать, но странно, что метод 'tostring()' возвращает странные вещи (байты?) 'Fromstring()' не работает отлично. – Ampo

+0

@Ampo вы можете использовать rep (ts) для просмотра двоичного файла, но вам нужно будет преобразовать его с помощью np.fromstring (ts, dtype = int), не забудьте использовать правильный тип данных. Используете ли вы поплавки или целые числа? Укажите тип массива, который вы пытаетесь отправить. – ajsp

3

Imagine у ​​вас есть Numpy массив целые числа (он работает с другими типами, но вам нужна небольшая модификация). Вы можете сделать это:

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

Если у вас есть массив поплавка, обязательно замените int на float в последней строке.

Вы также можете использовать __repr__() метод, который будет иметь преимущество работать для многомерных массивов:

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

Поскольку я использую 3D-массив (образ), метод '__repr __()' должен работать, но это не так. Массив действительно большой (1000000+ значений в нем). Я получаю 1000 значений после преобразования его с помощью '__repr __()' и 'eval()' crashes (?) – Ampo

+0

@Ampo yes, __repr __() падает с большими массивами, потому что представления больших массивов numpy (большие массивы имеют '...' вместо полных массивов). Вы можете изменить это поведение (с помощью set_printoptions) ... Я только что отредактировал свой ответ, посмотрим, работает ли это лучше. –

9

Если вы используете tostring вы теряете информацию как формы и типа данных:

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

Это означает, что вы должны отправить метаданные вместе с данными для получателя. Обменять авто-последовательных объектов, попробуйте 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

Смежные вопросы