【问题标题】:Change dtype data_type fields of numpy array更改 numpy 数组的 dtype data_type 字段
【发布时间】:2017-01-16 00:51:38
【问题描述】:

我有一个.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 中找不到受支持的数据类型。有什么帮助吗?
  3. 有没有办法用另一个(支持的)dtype 加载.mat 文件?我查看了here,但找不到任何有用的东西。

请注意,在 aMatFunction 内部,它使用 aMatStruct 就像这样:x = aMatStruct.x

【问题讨论】:

  • 你能上传一份你的matfile的副本并指定失败的确切八度函数吗?
  • “O”表示“对象”。该数组有 3 个字段。 matlab 源代码、单元格、结构上的 srray 是什么样的? oct 函数期望什么?

标签: python numpy scipy octave oct2py


【解决方案1】:

找到了解决方法!

我使用了following script,它从加载的结构中重构python字典,oct2py2又将其解释为matlab结构。

【讨论】:

    【解决方案2】:

    我打算建议将结果数组转换为有效的字典,但你打败了我,所以我不会编码它:p

    但是,我要建议的另一个更简单的解决方案是,由于您只使用 octave 内的结构,您可以将其加载到其工作区并直接评估。即以下对我有用:

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

    EDIT 哎呀,这是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']
    

    【讨论】:

    • 不是通用解决方案(我必须知道结构字段),但非常简单!
    • 嗯,当然,哈哈!您没有提供任何细节;你刚刚在“一个结构”上说“一个函数”,所以我只是用一个例子即兴创作:p 根据需要调整:)(话虽如此,这正是fieldnames 函数所做的,它为你提供了一个结构的名称字段!\o/)
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2011-12-07
    相关资源
    最近更新 更多