scipy.io.savemat如何保存全局变量?

时间:2015-09-29 15:05:11

标签: python matlab scipy

我正在尝试像在Matlab中那样使用Python。 基本上我有一些我运行的Python代码,它已经生成了一些全局变量。 说, a = 5 b = 3

我想将这些文件保存到.mat文件中,该文件可由Matlab打开。 目标是能够在Matlab中查看全局变量,就像在Matlab中保存到.mat文件时一样。

我见过使用savemat保存字典/数组的示例,但不是保存全局变量的示例。

我怎么能这样做?这是scipy不能做的事情吗?

感谢。

3 个答案:

答案 0 :(得分:2)

你很可能不想保存全局变量,而是本地变量(尽管变量是解释器的本地变量)。您可以通过locals()globals()函数访问和更新它们。

从那里,您可以使用首选的存储方式,例如picklemarshaljson或其他方式,具体取决于您需要的安全级别以及您拥有的对象类型在眼前。但是,要小心搞乱这些功能可能会让你遇到麻烦,因为它们也会报告函数和一些内部变量。

但是,如果您打算(如Matlab)只是通过GUI加载和存储变量,您可能需要检查 Spyder IDE GitHub project)。这是一个非常好的IDE,面向科学用途,与Matlab的旧界面非常相似(在外观上)。最重要的是,它提供了一个名为“可变资源管理器”的标签/窗格,用于跟踪您要存储的内容,并同时包含“将数据另存为... ”和“ 导入数据“按钮和”将数据另存为...“对话框支持保存到Spyder数据文件( .spydata),Matlab文件( .mat)和HDF5(* .h5)。

如果你想以编程方式执行此操作,可以查看Spyder是如何做到的。

答案 1 :(得分:1)

保存所有全局变量的问题在于您要保存所有全局变量。

您将保存导入的模块和全局命名空间中的所有其他内容。很多这些东西都无法转换成matlab可以处理的格式。例如,如何将模块scipy.io保存到.mat文件中?它也是一个全局变量!

话说回来,你可以通过调用globals()和本地变量来调用locals()来检索全局变量的dict。

在极少数情况下,您可以将其直接传递给scipy.io.savemat。通常,您需要将其过滤到要保存的变量。

有人说,有些情况scipy.io.savemat('filename.mat', locals())可能有意义。明确你要保存的内容仍然要好得多,但在某些情况下,转储所有本地变量可能很方便。

例如:

import numpy as np
import scipy.io

def main():
    x = np.arange(100)
    y = np.random.random((10, 10))
    scipy.io.savemat('test.mat', locals())

main()

答案 2 :(得分:1)

在Python中,我可以按名称保存变量,整数和数组:

In [112]: io.savemat('test.mat',{'i':i,'m':m,'rule':rule})
In [113]: io.loadmat('test.mat')
Out[113]: 
{'__version__': '1.0',
 'i': array([[2]]),
 '__globals__': [],
 'rule': array([[ 1.,  1., ...  1.,  1.]]),
 '__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Tue Sep 29 11:44:23 2015', 
 'm': array([[100]])}

让他们进入Octave会议

octave:5> load '../test.mat'
octave:6> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  ===== 
        i           1x1                          4  int32
        m           1x1                          4  int32
        rule        1x100                      800  double

Total is 102 elements using 808 bytes

当我使用io.savemat('test.mat', locals())尝试相同时,我收到有关保存class定义的不可能性的错误。 Python环境(全局变量)包含与MATLAB / Octave会话不兼容的各种事物 - 类,函数,模块等。在跨语言工作时,您需要关注兼容的变量。