Импорт массива неправильной формы в Python

У меня есть некоторые данные, сгенерированные в Mathematica, которые мне нужно импортировать в Python. Способ генерации данных основан на символьных вычислениях, поэтому просто генерировать их в Python не может быть и речи. Данные представляют собой массив измерений (126,2), но, где первая позиция в каждом элементе является целым числом, вторая позиция представляет собой список списков, а размеры не являются постоянными от элемента к элементу, например:

`
    {
    {-9,{{4,2},{5,6},{8,10}}},
    {-2,{{3,6},{6,1}}}
    {4,{{3,6},{6,1},{3,6},{6,1},{3,6},{6,1},{3,6},{6,1}}}
    }
`

будут первые три элемента. Вторая позиция в каждом элементе всегда будет списком двумерных списков. Цель здесь состоит в том, чтобы импортировать эти данные в виде массива numpy, чтобы я мог вызывать каждый элемент, независимо от его положения.

У меня был некоторый успех с numpy.genfromtxt("data.txt",delimiters = "}}}"), который дает мне правильную форму (126,2), но каждый элемент просто «нан».

У меня был больший успех с

`
with open("data.csv") as csvfile:
     reader = csv.reader(csvfile, delimiter=' ')
     for element in reader:
         print(np.asarray(element)[0])
`

Это дает мне целочисленные значения в виде массива, и это здорово! Для второй позиции в каждом элементе я пробовал:

`
def replace_all(text, dic):
    for i, j in dic.items():
        text = text.replace(i, j)
    return text
d = {"{":"[","}":"]"}
with open("spinweights.csv") as csvfile:
     reader = csv.reader(csvfile, delimiter=',')
     it=0
     for element in reader:
         while it<1:
             curlToSq=replace_all(str(element[1]),d)
             print(np.asarray(curlToSq))
`

Где функция replace_all меняет все фигурные скобки на квадратные скобки (мысль здесь заключалась в том, что это упростит преобразование в массив numpy). Последняя строка делает возвращает массив... формы (), ни один из его объектов не может быть подписан, что мне и нужно!

Любая помощь приветствуется.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
309
2

Ответы 2

Я думаю, что преобразовать это в структуру списка будет проще всего.

Я добавил , к следующему:

In [22]: astr = """ { 
    ...:     {-9,{{4,2},{5,6},{8,10}}}, 
    ...:     {-2,{{3,6},{6,1}}}, 
    ...:     {4,{{3,6},{6,1},{3,6},{6,1},{3,6},{6,1},{3,6},{6,1}}} 
    ...:     }"""                                                               
In [23]: astr1=astr.replace('{','[').replace('}',']').replace('\n','')          
In [24]: astr1                                                                  
Out[24]: ' [    [-9,[[4,2],[5,6],[8,10]]],    [-2,[[3,6],[6,1]]],    [4,[[3,6],[6,1],[3,6],[6,1],[3,6],[6,1],[3,6],[6,1]]]    ]'

Это различные оценщики строк. eval всегда в наличии. ast немного безопаснее. json.loads(astr1) тоже работает.

In [25]: alist= eval(astr1)                                                     
In [26]: alist                                                                  
Out[26]: 
[[-9, [[4, 2], [5, 6], [8, 10]]],
 [-2, [[3, 6], [6, 1]]],
 [4, [[3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1]]]]

Если это должен быть массив, выполните:

In [27]: arr = np.array(alist)                                                  
In [28]: arr                                                                    
Out[28]: 
array([[-9, list([[4, 2], [5, 6], [8, 10]])],
       [-2, list([[3, 6], [6, 1]])],
       [4,
        list([[3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1]])]],
      dtype=object)

Это (3,2). arr[:,0] — это массив целых чисел, а arr[:,1] — это массив списков.

genfromtxt по умолчанию пытается преобразовать ввод в число с плавающей запятой (то, что он может преобразовать, становится nan). Он предназначен для csv - аккуратной таблицы номеров строк с одинаковым количеством столбцов для каждой строки.

Вы можете использовать Export либо с "JSON", либо с "PythonExpression" для экспорта данных в файл. Любой из них может быть напрямую прочитан Python.

Ниже я использую ExportString для демонстрации.

С участием

x =
 {
  {-9, {{4, 2}, {5, 6}, {8, 10}}},
  {-2, {{3, 6}, {6, 1}}},
  {4, {{3, 6}, {6, 1}, {3, 6}, {6, 1}, {3, 6}, {6, 1}, {3, 6}, {6, 1}}}
  };

потом

ExportString[x, "JSON", "Compact" -> True]
[[-9,[[4,2],[5,6],[8,10]]],[-2,[[3,6],[6,1]]],[4,[[3,6],[6,1],[3,6],[6,1],[3,6],[6,1],[3,6],[6,1]]]]

или

ExportString[x, "PythonExpression"]
[[-9, [[4, 2], [5, 6], [8, 10]]], [-2, [[3, 6], [6, 1]]], [4, [[3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1], [3, 6], [6, 1]]]]

Язык Wolfram Language (также известный как Mathematica) может импортировать и экспортировать много форматов, причем два вышеперечисленных являются некоторыми из поддерживаемых им Основные форматы. Как правило, нет необходимости настраивать потребление кода для вывода, поскольку обычно доступен формат, который другая платформа может наивно (или имеет библиотеку) читать.

Надеюсь это поможет.

Это очень полезно! К сожалению, у меня все еще есть проблемы с переносом его в Python в виде массива с элементами с возможностью подписки. Я импортировал его как массив numpy nd (проверен тип), но его форма (). Есть идеи? Копирование и вставка будут работать, но...

Brendan Reid 09.03.2019 03:24

@BrendanReid Возможно, попробуйте экспортировать в формате "MAT" и посмотрите, есть ли библиотека Python, которая будет это импортировать. В противном случае задайте вопрос о том, как импортировать массив JSON в массив Python. Вы должны получить больше ответов на этот вопрос.

Edmund 09.03.2019 03:35

Другие вопросы по теме