将数据从 txt 导入 Mathematica
Posted
技术标签:
【中文标题】将数据从 txt 导入 Mathematica【英文标题】:Import data from txt to Mathematica 【发布时间】:2011-09-07 16:08:09 【问题描述】:考虑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,但无法让答案对我有用...
有什么想法吗?提前致谢!
【问题讨论】:
【参考方案1】:您应该指定您需要导入/导出的确切格式,否则 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
【讨论】:
通过模仿Export["data.m", a, "Package"]
的输出,我设法做我想做的事。谢谢!
@Dror,我认为您还需要使用其他软件读取数据文件。如果不是这种情况,而您只需要临时存储/保存数据,则“WDX”格式的导入/导出可能比“Package”快得多。但它是二进制的,因此您将无法使用文本编辑器检查它或将其导入其他程序。 “WDX”还可以存储任何类型的 Mathematica 表达式(我认为)。【参考方案2】:
对于存储 MMA 表达式,我建议使用 DumpSave
(二进制,取决于系统)、Save
或 Put
,但如果您想使用 Export,我会将 a 转换为 字符串 ,并将其导出为 text。 (我在下面使用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"]
【讨论】:
这与导出到“包”有何不同?实际上,我刚刚发现了导出为“包”格式(.m 文件)的可能性,但似乎也差不多。 @Szabolcs 我没有最模糊的想法,因为我也不知道导出到包选项。我现在已经研究了这种能力,我觉得“包”是要走的路(如果你不介意文件开头的 Wolfram 注释)。例如,如果您导出实数,“文本”选项会导出 6 位格式,而“包”使用完整的精度。【参考方案3】:你也可以这样做:
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
输出
【讨论】:
虽然这个适用于这个特定的例子,但对我来说它看起来真的很老套和脆弱。这基本上是构建一个 MathML 表达式,当渲染时,看起来或多或少像 Mathematica 表达式,然后重新导入它。只能希望重新导入的版本是相同的......如果我们采用这种方法,最好使用非易碎格式,比如只使用表达式的 InputForm(这就是导出到“包“格式确实)。据我所知,“MathML”对此没有优势,只有劣势。 @Szabolcs 由于问题范围是Import data from txt to Mathematica
,我认为这种方式是合适且有效的。 OP 不适用于expressions
,而只能使用结构为列表的data
。
然而,MathML 设计用于(两者)交换和格式化数学表达式,而不是列表或数组。可以认为这是一个意外,它没有问题......为什么你认为 MathML 比所有其他人类可读的可能性(如 InputForm(“Package”)、ExpressionML 等)更适合表示数组?跨度>
@Szabolcs 我没有说更好。它只是工作。但它(恕我直言)比在导出前加入和导入后分区要好。【参考方案4】:
我也遇到了这个问题。我的解决方案如下:
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
希望这会有所帮助。最好的问候。
【讨论】:
以上是关于将数据从 txt 导入 Mathematica的主要内容,如果未能解决你的问题,请参考以下文章
将数据从 txt 文件导入 IBM netezza SQL 数据库的错误
使用 PL/SQL 将数据从 file.txt 导入 Oracle SQL 表