python-3.x - 将 Numpy 结构数组保存到 *.mat 文件

标签 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 的结构化数组的结构不兼容。

我可以通过将数据拉入字典来解决此错误:
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]

但这似乎是一种非常低效的方法,因为我正在复制内存中的数据。有没有更聪明的方法来做到这一点?

最佳答案

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

这将创建一个结构 mydata带字段 foobar在文件中。

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

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

我不认为创建临时字典会复制内存中的数据,因为 Python 通常只存储引用,特别是 numpy 会尽可能尝试在原始数据中创建 View 。

关于python-3.x - 将 Numpy 结构数组保存到 *.mat 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35706697/

相关文章:

python - 字典 - 用 _ 替换键的空格,保持值相同

python - 如何在这段短代码中提高 numpy 的性能?

Python切片替换: with a variable

python-2.7 - 归一化矩阵行 scipy 矩阵

python - 递归/迭代函数返回括号内的内容?

python - 如何将 awk 的输出重定向为 python 中的变量?

python - 使用python进行异步文件分发

可变维数数组的Python方法

python - 将数据放在特定形状的列表中

python - 为什么 scipy bessel root 发现不返回零根?