更改numpy数组

时间:2016-09-08 07:30:12

标签: python numpy scipy octave oct2py

我有一个.mat文件,我使用scipy

加载
from oct2py import octave
import scipy.io as spio
matPath = "path/to/file.mat"
matFile = spio.loadmat(matPath)

我得到一个numpy数组,我希望使用oct2py传递给octave函数,就像那样:

aMatStruct = matFile["aMatStruct"]
result = octave.aMatFunction(aMatStruct)

但是我收到以下错误:

oct2py.utils.Oct2PyError: Datatype not supported

这似乎是由于数组dtype,它看起来像:[('x', 'O'), ('y', 'O'), ('z', 'O')]

所以我考虑将其更改为'S''U'或支持的内容。

  1. 怎么办?
  2. 我在otc2py documentation找不到支持的dtype。对此有何帮助?
  3. 有没有办法用另一个(支持的)dtype加载.mat文件?我看了here但找不到任何有用的东西。
  4. 请注意,在aMatFunction内,aMatStruct使用x = aMatStruct.xparameter

2 个答案:

答案 0 :(得分:0)

找到了解决方法!

我使用following script,它从加载的结构中重构python词典,oct2py2反过来将其解释为matlab结构。

答案 1 :(得分:0)

我打算建议将生成的数组转换为有效的字典,但是你打败了我,所以我不会对它进行编码:p

然而,我要建议的另一个更简单的解决方案是,由于您只在八度音阶中使用结构,因此可以将其加载到其工作空间中并直接进行评估。即以下为我工作:

>>> octave.load("MyFile.mat")
>>> octave.eval("fieldnames(S)")
ans = 
{
  [1,1] = name
  [2,1] = age
}
[u'name', u'age']

编辑嗯,这就是python解决方案;无论如何我还是开始了:p

>>> from oct2py import octave
>>> from scipy.io import loadmat
>>> F = loadmat("/home/tasos/Desktop/MyFile.mat")
>>> M = F["S"] # the name of the struct variable I saved in the mat file
>>> M = M[0][0]
>>> D = {M.dtype.names[i]:M[i][0] for i in range(len(M))}
>>> out = octave.fieldnames(D); out
[u'age', u'name']