我对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
答案 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)?