.mat到python数据传输

时间:2016-07-02 00:10:50

标签: python matlab scipy

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

导入数据
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     ]])]]

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

谢谢, jmatt

3 个答案:

答案 0 :(得分:0)

请注意datagroup['T'](和datagroup['P'])是numpy数组列表的列表。因此,如果要提取numpy数组,则需要执行以下操作:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我可以创建一个像你的例子一样打印的数组:

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]])]]

它是一个单独的元素,2d对象数组,包含一个二维数字数组。有几种方法可以提取内部数组:

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)?