Импорт массива неправильной формы в Python - PullRequest
2 голосов
/ 09 марта 2019

У меня есть некоторые данные, сгенерированные в 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.genfromtxt("data.txt",delimiters="}}}"), который дает мне правильную форму (126,2), но каждый элемент просто "nan".

У меня был еще один успех с

`
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 изменяет все фигурные скобки в квадратных скобках (здесь мы думаем, что это облегчит преобразование в массив с пустым фрагментом),Последняя строка там возвращает массив ... shape (), ни один из его объектов не может быть подписан, и это то, что мне нужно!

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

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Вы можете использовать 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) может импортировать и экспортировать многих форматов , причем два указанных выше являются некоторыми из Базовых форматов , которые он поддерживает.Как правило, нет необходимости настраивать использование кода для вывода, поскольку обычно существует формат, который другая платформа может наивно (или имеет библиотеку) читать.

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

1 голос
/ 09 марта 2019

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

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

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 - аккуратной таблицы номеров строк с одинаковым количеством столбцов для каждой строки.

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