【问题标题】:Writing Python numpy arrays to .mat file将 Python numpy 数组写入 .mat 文件
【发布时间】:2017-04-11 06:14:33
【问题描述】:

我有一系列 numpy 数组,我想将它们保存在 .mat 文件中,以便稍后绘制数据。 (我不想使用 Pickle,因为我的实际程序要复杂得多,并且有超过 2 个数组。)我的 MWE 是:

import numpy as np
import mat4py as m4p

x = np.array([1,20,0.4,0.5,9,8.8])
y = np.array([0.3,0.6,1,1,0.01,0.7])

data = {'x': x,
        'y': y}
m4p.savemat('datafile.mat', data)

但我收到错误ValueError: Only dicts, two dimensional numeric, and char arrays are currently supported

这是什么意思,我该如何解决?

【问题讨论】:

  • 试试 scipy 的savematfrom scipy import io; io.savemat(...)`。但它会将您的数组保存为 2d,因为这是 matlab 所期望的。
  • mat4py 适用于列表而不是 numpy 数组。 scipy 建立在 numpy 之上。

标签: python arrays matlab numpy dictionary


【解决方案1】:
In [853]: from scipy import io
In [854]: x = np.array([1,20,0.4,0.5,9,8.8])
     ...: y = np.array([0.3,0.6,1,1,0.01,0.7])
     ...: 
In [855]: data={'x':x, 'y':y}
In [856]: io.savemat('test.mat',data)
In [857]: io.loadmat('test.mat')
Out[857]: 
{'__globals__': [],
 '__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Sun Nov 27 09:30:35 2016',
 '__version__': '1.0',
 'x': array([[  1. ,  20. ,   0.4,   0.5,   9. ,   8.8]]),
 'y': array([[ 0.3 ,  0.6 ,  1.  ,  1.  ,  0.01,  0.7 ]])}

为了兼容 MATLAB,数组已转换为 2d orderF 数组。

h5py 是另一种选择。较新的 Matlab 版本使用 HDF5 格式,提供与其他语言的更大兼容性。

np.savez 可以在不修改数组的情况下保存数组字典:

In [881]: data={'x':x, 'y':y,'xy':np.array((x,y))}
In [882]: np.savez('test',**data)
In [883]: D=np.load('test.npz')
In [884]: D.keys()
Out[884]: ['y', 'x', 'xy']
In [885]: D['xy']
Out[885]: 
array([[  1.00000000e+00,   2.00000000e+01,   4.00000000e-01,
          5.00000000e-01,   9.00000000e+00,   8.80000000e+00],
       [  3.00000000e-01,   6.00000000e-01,   1.00000000e+00,
          1.00000000e+00,   1.00000000e-02,   7.00000000e-01]])

D 是一个NPZFile 对象,它是一个惰性加载器。所以它不会将所有数组直接转储到内存中。您可以通过键名访问它们。

【讨论】:

  • 我对 h5py 选项感兴趣,可以写入使用 MATLAB 创建的现有 .mat 文件。这可能吗?我不太明白如何从这个答案中构造数组。
  • @villaa,加载数组应该很简单,如上所示。将数组写入HDF5 文件记录在h5py 文档中。唯一的细微差别是order F 文件将保存为order C。我建议您阅读h5py,尝试一些简单的案例,如果遇到问题,请提出新问题。
【解决方案2】:

您必须将 numpy 数组转换为 python 列表。

您可以创建xy 之类的:

x = [1,20,0.4,0.5,9,8.8]
y = [0.3,0.6,1,1,0.01,0.7]

现在data 将包含python 列表,m4p.savemat('datafile.mat', data) 将起作用。

编辑:

如果您需要使用 numpy 数组,您可以在创建 data 时即时转换它们,如下所示:

data = {'x' : x.tolist(), 'y' : y.tolist()}

【讨论】:

    【解决方案3】:

    除非你需要与 Matlab 接口,否则真的没有理由使用mat4py。 您可以将内置 numpy.save() 用于单个数组,或将 numpy.savez() 用于多个数组。对于大型数组,请使用numpy.savez_compressed()

    【讨论】:

    • 看起来不错。我目前正在使用 Spyder - 是否有在我的工作区中保存 everything 的快捷方式,这样我就不必在 savez_compressed 中指定每个变量、数组等?
    • 我无法关注你。 Spyder 可以保存你所有的 .py 文件。在这里,我们谈论的是在 python 中的脚本运行时将一个或多个数组保存到一个文件中。
    • @ImportanceOfBeingEarnest 我最终将在无法使用 Spyder GUI 保存变量的 HPC 集群上运行此代码。我的意思是,有没有办法在不指定每个变量的情况下使用savez_compressed 保存工作区?
    • @MedullaOblongata 我不知道有任何此类选项。无论如何,我认为这没有多大意义,因为您通常不希望保存所有工作区,而只希望保存计算结果。跟踪然后保存的变量也很有意义,以便以后能够恢复它们。
    猜你喜欢
    • 2012-06-07
    • 2013-05-22
    • 2015-11-12
    • 2021-11-14
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2017-07-15
    • 2014-08-30
    相关资源
    最近更新 更多