类似Matlab的Python结构
我似乎已经找到了很多黑客的答案,但没有一个“标准化”的答案来回答这个问题。我希望在Python中实现Matlab的struct,特别是具有以下两个功能:类似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()中
其他人做什么?我不太担心这个结构的性能,它更方便。如果您使用的是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