类似Matlab的Python结构

类似Matlab的Python结构,python,matlab,numpy,scipy,Python,Matlab,Numpy,Scipy,我似乎已经找到了很多黑客的答案,但没有一个“标准化”的答案来回答这个问题。我希望在Python中实现Matlab的struct,特别是具有以下两个功能: 在结构“s”中,使用点符号(即s.a)访问字段值“a” 动态创建字段,不初始化数据类型、格式(即s.b=np.array([1,2,3,4])) 在Python中没有这样做的方法吗?到目前为止,我找到的唯一解决方案是使用伪类structtype()。这很管用,但感觉有点粗糙。 我还认为scipy可能会公开它的mat_结构,在loadmat()中

我似乎已经找到了很多黑客的答案,但没有一个“标准化”的答案来回答这个问题。我希望在Python中实现Matlab的struct,特别是具有以下两个功能:

  • 在结构“s”中,使用点符号(即s.a)访问字段值“a”
  • 动态创建字段,不初始化数据类型、格式(即s.b=np.array([1,2,3,4]))
  • 在Python中没有这样做的方法吗?到目前为止,我找到的唯一解决方案是使用伪类structtype()。这很管用,但感觉有点粗糙。 我还认为scipy可能会公开它的mat_结构,在loadmat()中使用,但我找不到它的公共接口。
    其他人做什么?我不太担心这个结构的性能,它更方便。

    如果您使用的是3.3及更高版本,则会出现问题。除此之外,空类可能是您的最佳选择。

    如果您使用的是3.3及以上版本,则可能会出现问题。除此之外,空类可能是您最好的选择。

    在八度音阶中,我做了:

    octave:2>      x.a = 1;
    octave:3>      x.b = [1, 2; 3, 4];
    octave:4>      x.c = "string";
    octave:7> save -7 test.mat x
    
    在ipython(2.7)中:

    在本例中,
    A['x']
    是一个numpy结构数组,有3个dtype=object字段

    In [33]: A['x']['b'][0,0]
    Out[33]: 
    array([[ 1.,  2.],
           [ 3.,  4.]])
    
    In [34]: A['x'][0,0]
    Out[34]: ([[1.0]], [[1.0, 2.0], [3.0, 4.0]], [u'string'])
    
    In [35]: A['x'][0,0]['b']
    Out[35]: 
    array([[ 1.,  2.],
           [ 3.,  4.]])
    
    由于
    x
    来自MATLAB,因此我必须使用
    [0,0]
    对其进行索引

    octave:9> size(x)
    ans =
       1   1
    
    我可以使用不同的开关加载
    A
    ,并使用
    .b
    格式访问属性:

    In [62]: A=loadmat('test.mat',struct_as_record=False)
    
    In [63]: A['x'][0,0].b
    Out[63]: 
    array([[ 1.,  2.],
           [ 3.,  4.]])
    
    在这种情况下,
    A['x']
    的元素类型为

    一些历史可能会有所帮助。MATLAB最初只有2d矩阵。然后他们将其扩展到更高的维度<添加了代码>单元格,具有相同的2d字符,但允许不同的内容<添加了代码>结构,允许使用“命名”属性。最初的MATLAB类系统是建立在结构上的(只是将某些函数链接到特定的类结构)。MATLAB现在已进入第二代课堂系统

    Python从类、字典和列表开始。使用与MATLAB结构相同的
    语法访问对象属性。带键的词典(通常,但不总是字符串)。列表用整数索引,并且始终允许不同的内容(如
    单元格
    )。有了一个成熟的对象类系统,就可以用Python构建更加复杂的数据结构,尽管访问仍然由基本的Python语法控制

    numpy
    添加n维数组。子类
    np.matrix
    始终是二维的,以旧式的MATLAB矩阵为模型。数组始终具有相同类型的元素。但是
    dtype=object
    数组包含指向Python对象的指针。在许多方面,它们只是带有数组包装器的Python列表。它们与MATLAB单元非常接近

    numpy
    还具有结构化数组,具有复合的
    dtype
    ,由
    字段组成<代码>字段
    按名称访问
    np.recarray
    是一个结构化数组,具有使用
    语法访问字段的附加功能。这使它们看起来非常像MATLAB结构数组。

    在八度音阶中,我做了:

    octave:2>      x.a = 1;
    octave:3>      x.b = [1, 2; 3, 4];
    octave:4>      x.c = "string";
    octave:7> save -7 test.mat x
    
    在ipython(2.7)中:

    在本例中,
    A['x']
    是一个numpy结构数组,有3个dtype=object字段

    In [33]: A['x']['b'][0,0]
    Out[33]: 
    array([[ 1.,  2.],
           [ 3.,  4.]])
    
    In [34]: A['x'][0,0]
    Out[34]: ([[1.0]], [[1.0, 2.0], [3.0, 4.0]], [u'string'])
    
    In [35]: A['x'][0,0]['b']
    Out[35]: 
    array([[ 1.,  2.],
           [ 3.,  4.]])
    
    由于
    x
    来自MATLAB,因此我必须使用
    [0,0]
    对其进行索引

    octave:9> size(x)
    ans =
       1   1
    
    我可以使用不同的开关加载
    A
    ,并使用
    .b
    格式访问属性:

    In [62]: A=loadmat('test.mat',struct_as_record=False)
    
    In [63]: A['x'][0,0].b
    Out[63]: 
    array([[ 1.,  2.],
           [ 3.,  4.]])
    
    在这种情况下,
    A['x']
    的元素类型为

    一些历史可能会有所帮助。MATLAB最初只有2d矩阵。然后他们将其扩展到更高的维度<添加了代码>单元格,具有相同的2d字符,但允许不同的内容<添加了代码>结构,允许使用“命名”属性。最初的MATLAB类系统是建立在结构上的(只是将某些函数链接到特定的类结构)。MATLAB现在已进入第二代课堂系统

    Python从类、字典和列表开始。使用与MATLAB结构相同的
    语法访问对象属性。带键的词典(通常,但不总是字符串)。列表用整数索引,并且始终允许不同的内容(如
    单元格
    )。有了一个成熟的对象类系统,就可以用Python构建更加复杂的数据结构,尽管访问仍然由基本的Python语法控制

    numpy
    添加n维数组。子类
    np.matrix
    始终是二维的,以旧式的MATLAB矩阵为模型。数组始终具有相同类型的元素。但是
    dtype=object
    数组包含指向Python对象的指针。在许多方面,它们只是带有数组包装器的Python列表。它们与MATLAB单元非常接近


    numpy
    还具有结构化数组,具有复合的
    dtype
    ,由
    字段组成<代码>字段
    按名称访问
    np.recarray
    是一个结构化数组,具有使用
    语法访问字段的附加功能。这使得它们看起来非常像MATLAB结构数组。

    最简单、直观、最相似的Python实现是使用
    type
    实例化一个临时类。它实际上类似于创建一个虚拟类,但我认为它在语义上更清楚地表达了一个类似结构的对象的意图

    >>> s = type('', (), {})()
    >>> s.a = 4
    >>> s.a
    4
    

    这里,type用于创建一个没有基(或父类,由空元组表示)且没有默认类属性(空字典)的无名类(因此为
    '
    ),最后的
    ()
    实例化了类/结构。请记住,传递到字典的值不会显示在实例的
    \uuu dict\uuu
    属性中,但这一事实可能与您无关。此方法也适用于较旧版本(<3.x)的Python。

    最简单且直观上最类似的Python实现是使用
    type