【问题标题】:.mat to python data transfer.mat 到 python 数据传输
【发布时间】:2016-07-02 00:10:49
【问题描述】:

我对 python 环境有些陌生,我正在将现有的 MATLAB 程序转移到 Python 中。我导入了一个 .mat 文件,其中包含四个我感兴趣的字段,其中一个包含 11340x1、11340x7 和 11340x8 数组的 14 个子字段以及一些气象数据字符串。我已使用

成功导入数据
import scipy.io as sio
import scipy

MATfile = sio.loadmat(E:/JP/Meadowdata.mat)

现在我想将这些数组/字符串放入变量中以在 Python 中使用。我开始了

datagroup = MATfile['MAIN'] #for MAIN field
T = datagroup['T'] #for Temp.
P = datagroup['P'] #for Precip....

其他数组以此类推。我希望将这些数组用于其中的值并查找数组的长度。但是,当我尝试找到长度时,它们总是以 1 而不是 11340 的长度返回,当我打印它们时,它看起来像这样

 [[array([[-5.55555556],
   [-5.55555556],
   [-5.55555556],
   ..., 
   [ 9.879     ],
   [ 8.17      ],
   [ 6.051     ]])]]

我注意到有些人以这种方式循环并提取值,但在我的情况下这将是太多的数据/时间,而且它似乎无论如何都不起作用。有什么方法可以获取这些数据?

谢谢, 杰马特

【问题讨论】:

  • 如果让T = datagroup['T'][0][0] 和P = datagroup['P'][0][0] 然后检查它们的长度呢?
  • 这些数组的.shape 和.dtype 是什么? .shape 等同于 size。 numpy 数组可能是 0 维的。
  • 可能重复:stackoverflow.com/questions/37996883/…。让我知道这是否有帮助。
  • 您是否尝试过 squeeze_me 的 loadmat 参数?

标签: python matlab scipy


【解决方案1】:

请注意,datagroup['T'](和datagroup['P'])是numpy 数组的列表。因此,如果要提取numpy数组,需要这样做:

T = datagroup['T'][0][0]
P = datagroup['P'][0][0]

【讨论】:

  • 您可能需要使用[()] 进行索引。检查shape 和dtype。 loadmat 经常将 MATLAB 结构嵌入到单元素对象 dtype 数组中。这些是 0d,所以需要这个特殊的索引。
【解决方案2】:

我有一个稍微不同但有时更稳定的解决方案。

我发现在 Matlab/Python 之间移动数据时最好的解决方案是在 matlab 中使用 JSON 导出库(例如this one),然后在 python 中使用 JSON 导入库。我发现这比 scipy 的 .mat 加载函数更稳定,特别是如果您计划频繁导入或使用任何更特定于 Matlab 的变量类型,例如结构。

【讨论】:

  • MATLAB 矩阵以什么形式传输?嵌套列表?
  • 使用 Python 的原生 json 库,是的,嵌套列表。 Numpy 的asarray() 可以很容易地将它们变成多维数组。
【解决方案3】:

我可以制作一个像您的示例一样打印的数组:

In [1355]: A=np.array([[None]])   
In [1356]: A[0,0]=np.array([[-5,-4,-3]])

In [1357]: A
Out[1357]: array([[array([[-5, -4, -3]])]], dtype=object)

In [1359]: print(A)
[[array([[-5, -4, -3]])]]

它是一个包含二维数值数组的单元素二维对象数组。提取内部数组有几种方法:

In [1360]: A.item()
Out[1360]: array([[-5, -4, -3]])

In [1362]: A[0,0]
Out[1362]: array([[-5, -4, -3]])

In [1363]: A[0][0]
Out[1363]: array([[-5, -4, -3]])

在其他问题中,外部数组是 0d How to access elements of numpy ndarray?

In [1364]: B=np.array(None) 
In [1365]: B[()]=np.array([[1,2,3]])

In [1366]: B
Out[1366]: array(array([[1, 2, 3]]), dtype=object)

In [1367]: print(B)
[[1 2 3]]

In [1368]: B[()]
Out[1368]: array([[1, 2, 3]])

In [1369]: B.item()
Out[1369]: array([[1, 2, 3]])

item 仍然有效。

我不确定差异在哪里。我没有在这台机器上运行 Octave,所以无法测试 V 数是否有影响。

本教程页面

http://students.mimuw.edu.pl/~pbechler/scipy_doc/tutorial/io.html

比loadmat 参考页更好。

在任何提取级别要问的问题是:

  • 这是什么?字典、数组

  • 如果是数组,dtype 是什么?目的?复合(结构化),数字

  • 它的形状是什么?多少维(ndim)?

【讨论】:

  • 谢谢大家。 numpy 提取效果很好。
猜你喜欢
  • 2014-02-16
  • 2019-01-20
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多