在八度音阶中我做到了: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)中:
^{pr2}$
在本例中,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最初只有二维矩阵。然后他们把它扩展到更高的维度。cells被添加,具有相同的2d字符,但允许不同的内容。structures已添加,允许“命名”属性。最初的MATLAB类系统是建立在结构上的(只是将某些函数链接到特定的类结构上)。MATLAB现在已经进入了它的第二代类系统。在
Python从类、字典和列表开始。对象属性的访问使用与MATLAB结构相同的.语法。带键的字典(通常,但不总是字符串)。用整数索引的列表,并且总是允许不同的内容(比如cells)。有了成熟的对象类系统,就可以用Python构造更复杂的数据结构,尽管访问仍然受基本Python语法的控制。在
{cdn>添加^-12维数组。子类np.matrix始终是2d的,建模于老式的MATLAB矩阵。数组总是有相同种类的元素。但是dtype=object数组包含指向Python对象的指针。在许多方面,它们只是带有数组包装器的Python列表。它们与MATLAB细胞很接近。在
numpy也有结构化数组,有一个复合的dtype,由fields组成。fields按名称访问。np.recarray是一个结构化数组,增加了使用.语法访问字段的能力。这使得它们看起来很像MATLAB的结构数组。在