python - 有人可以在 python (scipy.io) 中解释 mdict,例如在 scipy.io.savemat() 中吗?

标签 python matlab io scipy

我一直致力于在 python 中加载一些文件,然后在加载文件后,我想将它们导出到 .mat 文件中,然后在 MATLAB 中进行其余处理。我知道我可以这样做:

    import scipy.io as sio
    # load some files, assign loaded data to variables
    # ...
    sio.savemat(filename,mdict)

我在一定程度上理解这里发生的事情,并且看到它的语法如下:

    alist = [5,3,6]
    sio.savemat('small_list.mat',mdict={'alist':alist})

有人可以在 sio.savemat() 参数的第二部分中准确解释我在做什么吗,即 mdict = {'alist':alist} ?我可能只是对更 pythonic 的东西感到困惑(我对 python 比较陌生并且来自主要使用 C++ 的背景),但我对 mdict 术语在语法的哪些部分正在做什么感到困惑什么(引号部分是我在 MATLAB 中的变量名称,而未引号部分是我在 python 中的变量名称?)

此外,如果我想在一个 .mat 文件中保存(然后在 MATLAB 中加载)几个不同的变量,这会是什么样子?

最佳答案

根据文档,savemat 定义为

io.savemat(file_name, mdict, appendmat=True, format='5', long_field_names=False, do_compression=False, oned_as='row')

因此第二个参数是必需的,并且可以提供或不提供 mdict=... 部分。

它希望这是一个字典的原因是它需要知道保存变量(数据)的名称。如果它接受一个变量,它就必须组成一个名字。在 Python 语法中,这两个表达式将相同的东西传递给 foo。名称“alist”不会以任何方式传递给 foo

alist = np.arange(10)
foo('test.mat', alist)

foo('test.mat', np.arange(10))

loadmat 也返回一个字典,例如:

{'__version__': '1.0',
 '__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Mon May 25 09:19:36 2015',
 '__globals__': [],
 'alist': array([[1, 2, 3]])}

当我在 octave加载 text.mat 时,alist 变量出现在工作区中。

load 的函数形式产生一个结构

octave:5> r=load('test.mat')
r =
  scalar structure containing the fields:
    alist =
      1  2  3

save对应的octave函数形式为

save ("-option1", ..., "file", "v1", ...)

其中 "v1" 是您要保存的变量的名称。

octave/MATLAB 从全局命名空间中提取这些变量的值。在 Python 中(更强烈地)不鼓励这种行为。

save('-7','test1.mat',"alist")

octave 中加载为

In [1256]: io.loadmat('test1.mat')
Out[1256]: 
{'__version__': '1.0',
 '__header__': b'MATLAB 5.0 MAT-file, written by Octave 3.8.1, 2015-05-25 17:02:15 UTC',
 '__globals__': [],
 'alist': array([[1, 2, 3]])}

除了标题内容,其他都是一样的。

关于python - 有人可以在 python (scipy.io) 中解释 mdict,例如在 scipy.io.savemat() 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30440223/

相关文章:

Matlab:通过向量列表减去 3D 数组中的向量

python - 从 python 内部编写 bash 脚本

python:为每个新对象添加数字

python - 步长为 0.005 的 numpy.arange 的意外输出

matlab - 在 Matlab 中设计简单的带通/带阻滤波器

matlab - Octave 错误 : subscript indices must be either positive integers or logicals

c - 用C写大型二进制文件

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

c# - 拒绝访问 C# 中的文件

python - 我如何确保 Graphviz 可执行文件在我系统的路径上?