我正在尝试像在Matlab中那样使用Python。 基本上我有一些我运行的Python代码,它已经生成了一些全局变量。 说, a = 5 b = 3
我想将这些文件保存到.mat文件中,该文件可由Matlab打开。 目标是能够在Matlab中查看全局变量,就像在Matlab中保存到.mat文件时一样。
我见过使用savemat保存字典/数组的示例,但不是保存全局变量的示例。
我怎么能这样做?这是scipy不能做的事情吗?
感谢。
答案 0 :(得分:2)
你很可能不想保存全局变量,而是本地变量(尽管变量是解释器的本地变量)。您可以通过locals()
和globals()
函数访问和更新它们。
从那里,您可以使用首选的存储方式,例如pickle,marshal,json或其他方式,具体取决于您需要的安全级别以及您拥有的对象类型在眼前。但是,要小心搞乱这些功能可能会让你遇到麻烦,因为它们也会报告函数和一些内部变量。
但是,如果您打算(如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会话不兼容的各种事物 - 类,函数,模块等。在跨语言工作时,您需要关注兼容的变量。