Python,创建Matlab就像动态单元阵列一样

时间:2017-05-02 15:47:02

标签: python matlab numpy cell-array

你好我应该在python中翻译下面的matlab代码,它使用动态单元格数组:

NUM=zeros(size(CELLin));    NUM=NUM(:);
jALL=cell(0,0);
r=0;
for k=1:size(CELLin,1)
    r=r+1; NUM(r)=(numel(CELLin{k,1})-1)/2; % Ak NoptN
           jALL{r,1}=[k 1];
    r=r+1; NUM(r)=(numel(CELLin{k,2})-1)/2; % Ak NoptP
           jALL{r,1}=[k 2];
end

提前感谢您的支持。

1 个答案:

答案 0 :(得分:0)

如果我定义

CELLin = {[1,2],[1,2,3];[1,2,3],[1,2,3,4]}

并在Octave中运行您的代码

>> NUM
NUM =
   0.50000
   1.00000
   1.00000
   1.50000
>> jALL
jALL =
{
  [1,1] =
     1   1
  [2,1] =
     1   2
  [3,1] =
     2   1
  [4,1] =
     2   2

CELLin是一个nx2单元格,NUM在展平布局(n * 2行)中给出了单元格元素的某种平均长度。 jALL只是一个索引(可能是NUM)。

考虑到CELLin元素的可变长度,最简单的Python转换使用列表,而不是numpy。列表还允许我在没有预分配的情况下累积结果。例如,MATLAB代码将jALL首字母缩写为(0,0),但随着每个r赋值而增长。

# nested list; best equivalent to CELL
CELLin = [[[1,2],[1,2,3]],[[1,2,3],[1,2,3,4]]]

NUM = []
jALL = []
r = 0
for k, v in enumerate(CELLin): # iterate of 1st level
   r += 1
   NUM.append( (len(v[0])-1)/2.)
   jALL.append([r,1])
   r += 1
   NUM.append( (len(v[1])-1)/2.)
   jALL.append([r,2])
print(CELLin)
print(NUM)
print(jALL)

产生

1033:~/mypy$ python stack43742171.py 
[[[1, 2], [1, 2, 3]], [[1, 2, 3], [1, 2, 3, 4]]]
[0.5, 1.0, 1.0, 1.5]
[[1, 1], [2, 2], [3, 1], [4, 2]]

如果我添加

CELLin = np.array(CELLin)

它成为一个对象dtype数组(带有列表元素的2d)

array([[[1, 2], [1, 2, 3]],
      [[1, 2, 3], [1, 2, 3, 4]]], dtype=object)

其余代码运行相同的