将Python numpy数组写入.mat文件

时间:2016-11-27 12:11:12

标签: python arrays matlab numpy dictionary

我有一系列numpy数组,我想保存在.mat文件中,以便我可以稍后绘制数据。 (我不想使用Pickle,因为我的实际程序要复杂得多,并且有两个以上的数组。)我的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

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

3 个答案:

答案 0 :(得分:3)

您必须将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()}

答案 1 :(得分:3)

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对象,它是一个惰性加载器。所以它不会将所有数组直接转储到内存中。您可以通过密钥名称访问它们。

答案 2 :(得分:1)

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