我有一系列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
。
这是什么意思,我该如何解决这个问题?
答案 0 :(得分:3)
您必须将numpy
数组转换为python
列表。
您可以创建x
和y
,如:
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()
。