<p>在过去,MATLAB只有一个数据结构,一个矩阵。它可以包含数字或字符,并且总是二维的</p>
<p>添加单元格是为了包含更一般的对象,包括矩阵和字符串。它们还是二维的</p>
<p>Python的列表是1d的,但是可以包含任何内容。<code>numpy</code>是在Python上构建的,添加了多维数组。但名单还是有的。在</p>
<p>因此,任何将数组转换为列表的东西都可能等价于<code>num2cell</code>-不确切,但功能重叠。在</p>
<pre><code>In [246]: A=np.arange(24).reshape(2,3,4) # 3d array
</code></pre>
<p>在一个列表中换行,会给我们一个包含2个数组的列表(2d):</p>
^{pr2}$
<p><code>tolist</code>方法执行到列表(嵌套)的完整转换。在</p>
^{3}$
<p><code>list(A)</code>不常见,当<code>tolist</code>的意思时,可能会出错。在</p>
<p><code>np.split(A,...)</code>与<code>B</code>相似,但子阵列仍然是三维的</p>
<p><code>unpacking</code>甚至可以工作,基本上是因为<code>A</code>是一个iterable,<code>[a for a in A]</code>在第一个维度上拆分{<cd9>}。在</p>
<pre><code>In [257]: a,b=A
In [258]: a
Out[258]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
</code></pre>
<p>有一个object dtype,with允许您将对象(包括其他数组)放入数组中。但正如许多问题所表明的那样,这些问题可能很难构建。<code>np.array</code>试图构造尽可能高维的数组。你得耍些小把戏才能避开这个问题。在</p>
<pre><code>In [259]: Z=np.empty((2,),dtype=object)
In [260]: Z
Out[260]: array([None, None], dtype=object)
In [261]: Z[0]=A[0]
In [262]: Z[1]=A[1]
In [263]: Z
Out[263]:
array([ array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]),
array([[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])], dtype=object)
</code></pre>
<p>==============</p>
<p>在八度音阶中:</p>
<pre><code>>> anum = [1,2,3,4]
anum =
1 2 3 4
>> acell = num2cell(anum)
acell =
{
[1,1] = 1
[1,2] = 2
[1,3] = 3
[1,4] = 4
}
>> save -7 test.mat anum acell
</code></pre>
<p><code>scipy.io.loatmat</code>版本</p>
<pre><code>In [1822]: data = io.loadmat('../test.mat')
In [1823]: data
Out[1823]:
{'__globals__': [],
'__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.0.0,
2016-10-27 00:59:27 UTC',
'__version__': '1.0',
'acell': array([[array([[ 1.]]), array([[ 2.]]), array([[ 3.]]),
array([[ 4.]])]], dtype=object),
'anum': array([[ 1., 2., 3., 4.]])}
</code></pre>
<p><code>matrix</code>呈现为二维数组,<code>cell</code>呈现为对象类型数组(2d),在本例中,包含2d数组。在</p>