У меня есть некоторые данные, сгенерированные в 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). Последняя строка делает возвращает массив... формы (), ни один из его объектов не может быть подписан, что мне и нужно!
Любая помощь приветствуется.
Я думаю, что преобразовать это в структуру списка будет проще всего.
Я добавил ,
к следующему:
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 (проверен тип), но его форма (). Есть идеи? Копирование и вставка будут работать, но...