2011-06-03 2 views
5

Рассмотрим следующий список в Mathematica:Импорт данных из TXT в Mathematica

a = { 
    { 
    {0, 0, 0}, {1, 0, 0}, {1, 1, 0} 
    }, 
    { 
    {0, 0, 1}, {1, 0, 1}, {1, 1, 1} 
    } 
    }; 

Теперь вызываем:

Export["test.dat", a] 

и затем

b = Import["test.dat"] 

Вы увидите, что в конце a не равен b. Должен ли я рассматривать это как функцию или ошибку?

Кроме того, я хотел бы импортировать список, имеющим следующий формат: {P1,P2,P3...,Pn} где Pi={v1,v2,v3,...,vm} и каждый vi={x,y,z}, где x,y,z является числом, представляющие координаты вершин vi. Это должен быть список полигонов.

Как мне установить файл .dat, чтобы я мог прочитать его с помощью Mathematica и как его прочитать? Я попытался имитировать вывод Export["test.dat",a] выше, но затем я обнаружил другую проблему. Я нашел это question, но не смог заставить ответ работать для меня ...

Любые идеи? Заранее спасибо!

ответ

4

Необходимо указать точный формат, который требуется импортировать/экспортировать, в противном случае Mathematica, возможно, не сможет угадать правильный формат.

Итак, ваш вопрос сводится к тому, какой текстовый формат подходит для хранения 3D-массивов?

Если вы работаете с Mathematica, возможно, самой простой задачей является экспорт выражения с использованием синтаксиса выражений Mathematica, то есть Export["data.m", a, "Package"]. Этот формат относительно легко писать с других языков (но это не так легко разобрать). Другой вариант - создать новый простой для анализа текстовый формат для ваших 3D-данных и написать свои собственные функции ввода-вывода для него как в Mathematica, так и на других языках, с которыми вам нужно работать.

Поскольку формат данных вы работаете с фиксирован (у вас всегда есть координата триплеты), самое простое решение может быть просто расплющить список перед экспортом, и разделить его после импорта, как это:

Export["test.txt", Join @@@ a, "Table"] 
b = Import["text.txt", "Table"] 
Partition[#, 3]& /@ a 
+0

Имитируя вывод 'Export [" data.m ", a," Package "]' Мне удалось сделать то, что я хотел. Благодаря! – Dror

+0

@ Dror, я думал, вам нужно читать ваши файлы данных с другим программным обеспечением. Если это не так, и вам просто нужно временно хранить/сохранять данные, формат «WDX» может быть намного быстрее для импорта/экспорта, чем «Пакет». Но он двоичный, поэтому вы не сможете его проверить с помощью текстового редактора или импортировать в другие программы. «WDX» также может хранить любое выражение Mathematica (я думаю). – Szabolcs

1

Вы также можете сделать, например:

a={{{0,0,0},{1,0,0},{1,1,0}},{{0,0,1},{1,0,1},{1,1,1}}}; 

Export["c:\\test.dat",a,"MathML"]; 
[email protected]["c:\\test.dat","MathML"] 

(* 
->{{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}} 
*) 

дополнительным преимуществом является то, что этот метод не требует разбора Import OUTPUT

+0

, пока этот * работает * для этого конкретного примера, он выглядит очень хаки и хрупким для меня. То, что это делает, в основном создает выражение MathML, которое при визуализации * выглядит более или менее как выражение Mathematica, а затем повторно импортирует его. Можно только надеяться, что повторно импортированная версия будет такой же ... Если мы примем такой подход, гораздо лучше использовать не-хрупкий формат, например, просто использовать InputForm выражения (что является тем, что экспортируется в «Пакет» «формат»). Насколько я могу судить, «MathML» не имеет никаких преимуществ по сравнению с этим, только недостатки. – Szabolcs

+0

@Szabolcs. Поскольку область вопросов - «Импорт данных из txt в Mathematica», я думаю, что этот способ подходит и работает. OP не работает с 'выражениями', а только« данные », структурированные как списки. –

+1

Однако MathML предназначен для (обоих) обмена и форматирования математических выражений, а не списков или массивов. Можно считать случайным, что это работает без проблем ... почему вы думаете, что MathML - лучший выбор для представления массивов, чем все другие доступные для человека возможности, такие как InputForm («Пакет»), ExpressionML и т. Д.? – Szabolcs

2

Для хранения выражения ММЫ я хотел бы предложить DumpSave (двоичной, зависят от системы), Save или Put, но если вы хотите использовать Экспорт я бы преобразовать в строку и экспорт, что в качестве текста. (Я использую ImportString и ExpertString ниже, так что мне не нужен файл, но он работает одинаково для Import и Export). ИМО это твердое тело, как камень.

a = {{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}}; 
b = [email protected][ExportString[a // ToString, "Text"], "Text"] 

(* ==> 
{{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}} 
*) 

a == b 

(* ==> True *) 

Чтение списка полигонов должны работать так же:

b = [email protected]["test.dat", "Text"] 
+0

Как это отличается от экспорта в «Пакет»? На самом деле я просто обнаружил возможность экспорта в формат «Пакет» (файл .m), но он, похоже, делает примерно то же самое. – Szabolcs

+1

@Szabolcs У меня не было ни малейшего представления о том, что я тоже не знал об экспорте в пакет. Теперь я изучил эту возможность, и я чувствую, что «Пакет» - это путь (если вы не возражаете против комментария Вольфрама в начале файла). Например, если вы экспортируете реалы, опции «Текст» экспортируют 6-значный формат, тогда как «Пакет» использует полную точность. –

1

Я тоже хожу эту проблему. Мое решение таково:

IN[]: a = {{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}}; 
     Export["test.dat", a, "List"]; 
     b = [email protected]["test.dat", "List"]; 
     a == b 

Out[]: True 

Надеюсь, что это поможет. С наилучшими пожеланиями.

Смежные вопросы