Mathematica导入Python

时间:2017-05-25 06:42:09

标签: python import wolfram-mathematica

我有一个包含从Mathematica获得的三维数组(100X100X100)的文本文件。数据以逗号和大括号存储。我想使用此文本文件使用Python分析和绘制数据。如何在Python中导入数据?我目前正在使用Python 2.7版本。在matematica中存储数据以便在Python中使用它的格式是什么?

1 个答案:

答案 0 :(得分:0)

因为看到人们在ascii中存储了这么多数据让我感到很痛苦,所以这是一种进行二进制交换的方法:

数学:

data = RandomReal[{-1, 1}, {3, 4, 5}]
f = OpenWrite["test.bin", BinaryFormat -> True];
BinaryWrite[f, ArrayDepth[data], "Integer32"];
BinaryWrite[f, Dimensions[data], "Integer32"];
BinaryWrite[f, data, "Real64"];
Close[f]

蟒:

import numpy as np
with open('test.bin','rb') as f:
 depth=np.fromfile(f,dtype=np.dtype('int32'),count=1)
 dims =np.fromfile(f,dtype=np.dtype('int32'),count=depth)
 data =np.reshape(np.fromfile(f,dtype=np.dtype('float64'),
         count=reduce(lambda x,y:x*y,dims)),dims)

请注意,如果您在不同的硬件上进行读/写,则可能会出现字节序问题。 (虽然容易处理)

编辑:为了完整性,使用原生mathematica格式的文本交换如下所示:

数学:

m = RandomReal[{-1, 1}, {8, 8}]
m >> out.m

蟒:

with open('out.m','r') as f: text=f.read()
for rep in (('{','['),('}',']')):text=text.replace(rep[0],rep[1])
array=eval(text)

有几个注意事项,第一个eval不应该用于未经输入的输入,其次如果任何值使用科学记数法,或者显然任何数学符号内容,这将会中断。最后,对于大量输入来说无疑会非常缓慢。如果您遇到mathematica文件并且无法使用mathematica将其设置为更好的格式,我会认真地使用它。