Python Numpy中的matlab cell2mat函数?

时间:2015-03-30 23:09:28

标签: python matlab numpy

numpy有cell2mat功能吗?这是matlab的链接。我发现了一个类似的实现,但它只有在我们可以均匀分割时才有效。这是link

2 个答案:

答案 0 :(得分:2)

从某种意义上说,Python的'单元'比MATLAB更长 - list。 python列表是1d单元格的直接替代品(或者更确切地说,是1维大小的单元格)。可以将2d单元表示为嵌套列表。带有dtype对象的numpy数组也可以工作。我相信scipy.io.loadmat用于在.mat文件中呈现单元格。

np.array()将列表或列表等转换为ndarray。有时它需要帮助指定dtype。它还尝试将输入呈现为尽可能高的维数。

np.array([1,2,3])
np.array(['1',2,'abc'],dtype=object)
np.array([[1,2,3],[1,2],[3]])
np.array([[1,2],[3,4]])

MATLAB结构映射到Python词典或对象。

http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html

loadmat也可以将结构表示为numpy结构(记录)数组。

np.concatenate有一个数组列表及其便利衍生物vstackhstackdstack。大多数情况下,他们调整数组的大小,然后在一个轴上连接。


这是MATLAB cell2mat示例的粗略近似值:

C = {[1],    [2 3 4];
     [5; 9], [6 7 8; 10 11 12]}

构造具有相同形状的ndarray

In [61]: c11=np.array([[1]])    
In [62]: c12=np.array([[2,3,4]])
In [63]: c21=np.array([[5],[9]])
In [64]: c22=np.array([[6,7,8],[10,11,12]]) 

使用hstackvstack的组合加入它们 - 即沿着匹配的轴连接。

In [65]: A=np.vstack([np.hstack([c11,c12]),np.hstack([c21,c22])])
# or A=np.hstack([np.vstack([c11,c21]),np.vstack([c12,c22])])
制造

array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

或更普遍(紧凑)

In [75]: C=[[c11,c12],[c21,c22]]
In [76]: np.vstack([np.hstack(c) for c in C])

答案 1 :(得分:1)

我通常使用对象数组来代替Matlab的单元数组。例如:

cell_array = np.array([[np.arange(10)],
                       [np.arange(30,40)] ],
                       dtype='object')

是一个2x1对象数组,包含10个numpy数组向量。我可以通过以下方式执行cell2mat功能:

arr = np.concatenate(cell_array).astype('int')

返回2x10 int数组。您可以将.astype('int')更改为您需要的任何数据类型,或者您可以从cell_array中的一个对象中获取它,

arr = np.concatenate(cell_array).astype(cell_array[0].dtype)
祝你好运!