将数据从txt导入Mathematica

时间:2011-06-03 08:54:04

标签: import wolfram-mathematica data-import

考虑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是表示顶点坐标的数字{ {1}}。这应该是一个多边形列表。

我应该如何设置我的vi文件,以便我可以使用Mathematica阅读它,我该如何阅读?我试图模仿上面.dat的输出,但后来发现了另一个问题。我找到了question,但无法让答案对我有用......

有什么想法吗?提前谢谢!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

对于存储MMA表达式,我建议DumpSave(二进制,依赖于系统),SavePut,但如果要使用导出,我会将a转换为< em> string ,并将其导出为 text 。 (我使用下面的ImportStringExpertString,因此我不需要文件,但ImportExport的工作方式相同。 IMO这是一块坚如磐石的人。

a = {{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}};
b = ToExpression@ImportString[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 = ToExpression@ImportString["test.dat", "Text"]

答案 2 :(得分: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"];
b=ToExpression@Import["c:\\test.dat","MathML"]

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

额外的好处是此方法不需要解析Import输出

答案 3 :(得分: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 = ToExpression@Import["test.dat", "List"];
      a == b

Out[]: True

希望这会有所帮助。最好的问候。