【问题标题】:Import data from txt to Mathematica将数据从 txt 导入 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,但无法让答案对我有用...

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

【问题讨论】:

    标签: import wolfram-mathematica data-import


    【解决方案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(二进制,取决于系统)、SavePut,但如果您想使用 Export,我会将 a 转换为 字符串 ,并将其导出为 text。 (我在下面使用ImportStringExpertString,所以我不需要文件,但它对ImportExport 的工作方式相同)。国际海事组织这是坚如磐石。

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      相关资源
      最近更新 更多