将Numpy Structure Array保存到* .mat文件

时间:2016-02-29 18:21:11

标签: python-3.x numpy scipy

我正在使用numpy.loadtext从CSV数据文件生成结构化Numpy数组,我希望将其保存到MAT文件中,以供熟悉MATLAB而不是Python的同事使用。

示例案例:

import numpy as np
import scipy.io

mydata = np.array([(1, 1.0), (2, 2.0)], dtype=[('foo', 'i'), ('bar', 'f')])
scipy.io.savemat('test.mat', mydata)

当我尝试在此数组上使用scipy.io.savemat时,会抛出以下错误:

Traceback (most recent call last):
  File "C:/Project Data/General Python/test.py", line 6, in <module>
    scipy.io.savemat('test.mat', mydata)
  File "C:\python35\lib\site-packages\scipy\io\matlab\mio.py", line 210, in savemat
    MW.put_variables(mdict)
  File "C:\python35\lib\site-packages\scipy\io\matlab\mio5.py", line 831, in put_variables
    for name, var in mdict.items():
AttributeError: 'numpy.ndarray' object has no attribute 'items'

我是Python新手(充其量),但我假设这是因为savemat设置为处理dicts并且Numpy结构化数组的结构不兼容。

我可以通过将数据拉入dict来解决这个错误:

tmp = {}
for varname in mydata.dtype.names:
    tmp[varname] = mydata[varname]

scipy.io.savemat('test.mat', tmp)

哪些加载到MATLAB中:

>> mydata = load('test.mat')

mydata = 

    foo: [1 2]
    bar: [1 2]

但这似乎是一种非常低效的方法,因为我复制了内存中的数据。有没有更聪明的方法来实现这个目标?

1 个答案:

答案 0 :(得分:8)

你可以scipy.io.savemat('test.mat', {'mydata': mydata})

这会在文件中创建一个包含字段mydatafoo的结构bar

或者,您可以将循环打包成dict理解:

tmp = {varname: mydata[varname] for varname in mydata.dtype.names}

我不认为创建一个temprorary字典会复制内存中的数据,因为Python通常只存储引用,而numpy特别试图尽可能地创建原始数据的视图。