2015-03-30 227 views
0

numpy是否具有cell2mat功能?这里是链接到matlab。我发现了一个类似的实现,但只有当我们可以均匀分割它时才有效。这里是link在Python Numpy中的Matlab cell2mat函数?

+1

有在numpy的无细胞阵列。预期的输出可能是一个np.array,但是你的输入是什么? – Daniel 2015-03-30 23:51:40

+0

'np.vstack'和'np.hstack'的组合可以连接一个嵌套的兼容数组列表。 – hpaulj 2015-03-31 18:48:05

回答

2

从某种意义上说,Python的'单元'比MATLAB更长 - list。一个python列表是一个1d单元格的直接替代品(更确切地说,是一个1维的单元格)。二维单元格可以表示为一个嵌套列表。 numpy与dtype对象的数组也可以工作。我相信这是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需要一个数组的列表及其方便的衍生品vstack, hstack,dstack。通常他们调整数组的大小,然后在一个轴上连接。


这里有一个粗略的估计到MATLAB cell2mat例如:

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

结构ndarrays具有相同的形状

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

我通常使用对象数组作为Matlab的单元阵列的替代品。例如:

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

是包含长度为10个numpy数组向量的2x1对象数组。我可以通过执行cell2mat功能:

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

这将返回一个2×10整数数组。您可以更改.astype('int')是你需要的任何数据类型,或者你可以从你的cell_array的对象之一抓住它,

arr = np.concatenate(cell_array).astype(cell_array[0].dtype) 

祝你好运!