Import 将数据从txt导入Mathematica

Import 将数据从txt导入Mathematica,import,wolfram-mathematica,data-import,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。我应该认为这是一个特性还是一个bug? 此外,我想导入一个具有以下格式的列表:{P1,P2,P3…

考虑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
。我应该认为这是一个特性还是一个bug?

此外,我想导入一个具有以下格式的列表:
{P1,P2,P3…,Pn}
其中
Pi={v1,v2,v3,…,vm}
和每个
vi={x,y,z}
其中
x,y,z
是表示顶点坐标的数字
vi
。这应该是一个多边形列表

我应该如何设置
.dat
文件,以便使用Mathematica读取它,以及我应该如何读取它?我试图模仿上面的
Export[“test.dat”,a]
的输出,但后来我发现了另一个问题。我找到了这个,但无法让答案适用于我


有什么想法吗?提前谢谢

您应该指定导入/导出所需的确切格式,否则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

您也可以这样做,例如:

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}}}
*)

另外一个好处是,这种方法不需要解析
导入
输出

来存储MMA表达式,我建议
转储保存
(二进制,取决于系统),
保存
放入
,但如果您想使用导出,我会将a转换为字符串,并将其导出为文本。(我在下面使用了
ImportString
ExpertString
,因此我不需要文件,但它对
Import
Export
的作用相同)。在我看来,这像岩石一样坚硬

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"]

我也去解决这个问题。我的解决方案如下:

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

希望这有帮助。致以最诚挚的问候。

通过模仿
Export[“data.m”,a,“Package”]
的输出,我成功地完成了我想要的任务。谢谢@Dror,我想你也需要用其他软件读取数据文件。如果不是这样,您只需要暂时存储/保存数据,“WDX”格式的导入/导出速度可能比“Package”快得多。但是它是二进制的,所以您不能用文本编辑器检查它,也不能将它导入其他程序。“WDX”还可以存储任何类型的Mathematica表达式(我认为)。虽然这适用于这个特定的示例,但对我来说它看起来非常粗糙和脆弱。这基本上是构建一个MathML表达式,当呈现时,它看起来或多或少像Mathematica表达式,然后重新导入它。我们只能希望重新导入的版本将是相同的。。。如果我们采用这种方法,最好使用非脆弱格式,比如只使用表达式的InputForm(这就是导出到“Package”格式所做的)。据我所知,“MathML”在这方面没有优势,只有劣势。@Szabolcs由于问题的范围是
将数据从txt导入Mathematica
,我认为这种方法是合适的,而且有效的。OP不使用
表达式
,只使用结构化为列表的
数据。但是,MathML设计用于(同时)交换和格式化数学表达式,而不是列表或数组。这可以被认为是一个意外,因为它没有问题。。。为什么您认为MathML比其他所有人类可读的方法(如InputForm(“Package”)、ExpressionML等)更适合表示数组?@Szabolcs我没有说得更好。它只是工作。但它(IMHO)比导出前加入和导入后分区要好。这与导出到“包”有什么不同?事实上,我刚刚发现了导出到“包”格式(.m文件)的可能性,但它似乎也是如此。@Szabolcs我一点也不知道,因为我也不知道导出到包选项。我现在已经研究了这个功能,我觉得“包”是一个不错的选择(如果您不介意文件开头的Wolfram注释的话)。例如,如果导出real,“Text”选项导出6位格式,而“Package”使用完全精确。