在早期的MATLAB版本(大约v.3.0左右),只有一种数据结构,即矩阵。它可以包含数字或字符,并且始终是二维的。
后来加入了单元格(Cells)以包含更一般的对象,包括矩阵和字符串。但它们仍然是二维的。
Python有列表(lists),它们是一维的,但可以包含任何东西。numpy是在Python上构建的,添加了多维数组。但列表仍然可用。
因此,将数组转换为列表的任何方法都可能等同于num2cell - 不完全相同,但具有重叠的功能。
In [246]: A=np.arange(24).reshape(2,3,4) # 3d array
将数组放入列表中,得到一个由两个数组(2维)组成的列表:
In [247]: B=list(A)
In [248]: B
Out[248]:
[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]])]
tolist
方法将完全转换为列表(嵌套)。
In [249]: C=A.tolist()
In [250]: C
Out[250]:
[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]],
[[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]
list(A)
并不常用,当需要使用 tolist
时可能会错误地使用它。
np.split(A,...)
与 B
类似,但子数组仍为三维数组。
unpacking
甚至可以使用,基本上是因为 A
是可迭代的,[a for a in A]
在第一维上分割了 A
。
In [257]: a,b=A
In [258]: a
Out[258]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
有一个对象dtype,它允许您在数组中放置对象,包括其他数组。但正如许多SO问题所示,构建这些数组可能会很棘手。np.array
试图构造最高维度的数组。您需要执行一些技巧来避免这种情况。
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)
================
在Octave会话中:
>> 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
scipy.io.loadmat
版本
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.]])}
matrix
会被呈现为一个二维数组;cell
则是一个对象类型的二维数组,包含了另外的二维数组。
num2cell()
在分割数据方面非常有用。它允许您轻松切片任何多维数组为各个部分,便于随后的操作。您可以将其切片,使得您可以获得行的列表、列的列表等等,甚至是任意块的列表。 - Rody Oldenhuis