Как преобразовать 3D строку в массив numpy, созданный после сохранения 3D изображения в CSV - PullRequest
0 голосов
/ 30 января 2020

У меня есть файл CSV, в котором есть один столбец с данными изображения. Перед сохранением в CSV каждое изображение представляло собой массив 3D numpy. Таким образом, каждая ячейка этого столбца была трехмерным массивом. После сохранения в CSV и чтения с помощью pandas они конвертируются в строку. Теперь я хочу воссоздать массив из них. Ниже вы можете найти образец строки, которую я хочу преобразовать в массив 3D numpy.

import numpy as np

my_string_array = str(np.random.randint(0, high=255, size=(51, 52, 3)))

Я попробовал описанный здесь персонал как прочитать numpy 2D массив из строки? , но, похоже, мне нужно что-то другое, поскольку у меня есть 3D-массив.

Я знаю, что если массивы были преобразованы в list перед сохранением в CSV, то

import ast
my_array = np.array(ast.literal_eval(my_string_array))

будет работать, но, к сожалению, это не так. После запуска этого я получил ошибку:

Traceback (most recent call last):

  File "/opt/lyp-venv/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3319, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)

  File "<ipython-input-25-3e5a6dae7682>", line 2, in <module>
    my_array = np.array(ast.literal_eval(my_string_array))

  File "/usr/lib/python3.7/ast.py", line 46, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')

  File "/usr/lib/python3.7/ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)

  File "<unknown>", line 1
    [[[205  60 145]
             ^  
SyntaxError: invalid syntax

1 Ответ

0 голосов
/ 31 января 2020

Относительно добавленной ошибки:

ast.literal_eval(my_string_array)
....
[[[205  60 145]
         ^  
SyntaxError: invalid syntax

literal_eval работает на ограниченном подмножестве синтаксиса Python. Например, он будет работать с допустимым вводом списка, например, "[[205, 60, 145]]". Но строка в сообщении об ошибке не соответствует этому; пропущены запятые. str(an_array) пропускает запятые. str(an_array.tolist()) нет.

В большинстве ответов, касающихся загрузки csv файлов, например, подчеркивается, что вам потребуется заменить пробелы (или пустые разделители) запятыми.

Таким образом, в данном случае ошибка не имеет ничего общего с массивом 3d.

Позвольте мне проиллюстрировать:

make 3d array:

In [720]: arr = np.arange(24).reshape(2,3,4)                                                     

In [722]: arr                                                                                    
Out[722]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

Это str представление, которое, вероятно, pandas пишет в CSV:

In [723]: str(arr)                                                                               
Out[723]: '[[[ 0  1  2  3]\n  [ 4  5  6  7]\n  [ 8  9 10 11]]\n\n [[12 13 14 15]\n  [16 17 18 19]\n  [20 21 22 23]]]'

Сравните это с тем, как выглядит список str:

In [724]: arr.tolist()                                                                           
Out[724]: 
[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]],
 [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]
In [725]: str(arr.tolist())                                                                      
Out[725]: '[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]'

literal_eval не имеет проблем с этой строкой тройного вложенного списка:

In [726]: ast.literal_eval(_)                                                                    
Out[726]: 
[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]],
 [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]

literal_eval, примененный к строке массива, приводит к вашей ошибке:

In [727]: ast.literal_eval(Out[721])                                                             
Traceback (most recent call last):

  File "/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py", line 3319, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)

  File "<ipython-input-727-700e3f960e29>", line 1, in <module>
    ast.literal_eval(Out[721])

  File "/usr/lib/python3.6/ast.py", line 48, in literal_eval
    node_or_string = parse(node_or_string, mode='eval')

  File "/usr/lib/python3.6/ast.py", line 35, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)

  File "<unknown>", line 1
    [[[ 0  1  2  3]
           ^
SyntaxError: invalid syntax

Я мог бы исправить это с парой строковых подстановок, эффективно преобразующих Out[721] в Out[725].

@ Mad указал, что если массив достаточно большой (более 1000 элементов), str создаст сжатую версию, заменяя большую часть значения с «...». Вы можете убедиться в этом сами. Если это так, никакое количество редактирования строк не решит проблему. Эта строка бесполезна.

В как читать numpy 2D массив из строки? , мой ответ имеет ограниченные значения, так как у вас уже есть строка. { ссылка } лучше. У меня также ТАК вопросы, которые конкретно касаются строк, которые появляются в pandas csv. В любом случае вам нужно обратить внимание на детали строки, особенно на разделители и специальные символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...