преобразование строки в кортеж в Python - PullRequest
0 голосов
/ 06 марта 2019

У меня есть кортеж (h) следующим образом:

(array([[145,  34,  26,  18,  90,  89],
   [ 86, 141, 216, 167,  67, 214],
   [ 18,   0, 212,  49, 232,  34],
   ...,
   [147,  99,  73, 110, 108,   9],
   [222, 133, 231,  48, 227, 154],
   [184, 133, 169, 201, 162, 168]], dtype=uint8), array([[178,  58,  24,  90],
   [  3,  31, 129, 243],
   [ 48,  92,  19, 108],
   ...,
   [148,  21,  25, 209],
   [189, 114,  46, 218],
   [ 15,  43,  92,  61]], dtype=uint8), array([[ 17, 254, 216, ..., 126,  74, 129],
   [231, 168, 214, ..., 131,  50, 107],
   [ 77, 185, 229, ...,  86, 167,  61],
   ...,
   [105, 240,  95, ..., 230, 158,  27],
   [211,  46, 193, ...,  48,  57,  79],
   [136, 126, 235, ..., 109,  33, 185]], dtype=uint8))

Я преобразовал его в строку s = str (h):

'(array([[  1,  60, 249, 162,  51,   3],\n       [ 57,  76, 193, 244,  17, 238],\n       [ 22,  72, 101, 229, 185, 124],\n       ...,\n       [132, 243, 123, 192, 152, 107],\n       [163, 187, 131,  47, 253, 155],\n       [ 21,   3,  77, 208, 229,  15]], dtype=uint8), array([[119, 149, 215, 129],\n       [146,  71, 121,  79],\n       [114, 148, 121, 140],\n       ...,\n       [175, 121,  81,  71],\n       [178,  92,   1,  99],\n       [ 80, 122, 189, 209]], dtype=uint8), array([[ 26, 122, 248, ..., 104, 167,  29],\n       [ 41, 213, 250, ...,  82,  71, 211],\n       [ 20, 122,   4, ..., 152,  99, 121],\n       ...,\n       [133,  77,  84, ..., 238, 243, 240],\n       [208, 183, 187, ..., 182,  51, 116],\n       [ 19, 135,  48, ..., 210, 163,  58]], dtype=uint8))'

Теперь я хочу преобразоватьВернемся к кортежу.Я пытался использовать ast.literal_eval (s), но я получаю следующую ошибку:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/ast.py", line 84, in literal_eval
return _convert(node_or_string)
File "/usr/lib/python3.5/ast.py", line 55, in _convert
return tuple(map(_convert, node.elts))
File "/usr/lib/python3.5/ast.py", line 83, in _convert
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Call object at 0x76a6f770>

Я нигде не мог найти это точное решение.Было бы здорово, если бы кто-нибудь мог мне помочь.

1 Ответ

0 голосов
/ 06 марта 2019

Вы не можете использовать str() для пустых массивов (обернутых в кортежи или иным образом) и надеяться восстановить данные.

Прежде всего, функция ast.literal_eval() поддерживает только литералы и , а не синтаксис array(...).

Далее str() в кортеже выдает вывод для отладки ; кортежи не реализуют хук преобразования строки __str__, поэтому вместо них возвращается их представление repr(). Массивы Numpy поддерживают преобразование str(), но их вывод по-прежнему представляет собой дружественную строку, в которой много фактических значений опущено. В вашем примере эти ... многоточия указывают, что в этой части массива имеется больше данных, но строки не включают эти значения . Таким образом, вы теряете данные, если пытаетесь воссоздать свои массивы из этого.

Если вам нужно хранить эти кортежи в столбце файла или базы данных или передавать их по сетевому соединению, вам необходимо сериализовать данные. Правильная сериализация сохранит каждую деталь массивов.

Для кортежей с массивами numpy вы можете использовать pickle.dumps() для создания bytes объекта, который можно передать обратно в pickles.loads() для воссоздания того же значения.

Вы также можете преобразовать отдельные пустые массивы в двоичный формат, специфичный для numpy, и снова загрузить этот формат с помощью функций numpy.save() и numpy.load() (которые работают непосредственно с файлами, но вы можете передать io.BytesIO() объекты ).

...