【问题标题】:Python , create Matlab's like Dynamic cell arrayPython , 创建 Matlab 之类的动态元胞数组
【发布时间】:2017-05-02 15:47:01
【问题描述】:

你好,我应该在 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

提前感谢您的支持。

【问题讨论】:

  • 您能否提供一个示例CELLin(以及任何其他未定义的变量),以便我至少可以在 Octave 会话中运行您的代码。如果不清楚代码的作用,就很难翻译。 (注意,人们会抱怨这不是代码翻译服务)
  • 好的,CELLin 是一个有四个条目(列)的元胞数组,对于每个条目,我们有一个数字向量,必须动态增加的是 jALL 元胞数组的行数,CELLin 是通过输入传递。现在我需要了解如何在 python 中创建一个动态单元格数组,以便对其他用户也有用。
  • Python 中最接近单元格的是列表。
  • 从技术上讲,您不能在 MATLAB 中动态更改矩阵或元胞数组的大小。 MATLAB 在幕后进行缓慢而昂贵的复制,这就是为什么 MATLAB 编辑器会在注意到您这样做时警告您。

标签: python matlab numpy cell-array


【解决方案1】:

如果我定义

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)

其余代码运行相同

【讨论】:

  • 嗯嗯好的。但是,如果我想像矩阵 rx4 一样创建 CELLin,其中 r 动态变化我该怎么办??
  • numpy 有对象数组,但在大多数情况下,它们只是美化或贬低的列表。您的代码引用了 2 列 CELLin。我不知道您所说的“动态更改”是什么意思。我的代码中没有任何内容与预定义的 CELLin 大小相关联。
  • 在matlab中:CELLin=cell(0,0); CELLin{1,1}=2 ; CELLin{2,1}=3我想在python中重申同样的,没有预先分配CELLin,所以它的行号应该动态改变
  • 在 Python 中,唯一能让您通过简单地索引元素来添加元素的结构是字典。您可以使用appendextend 方法扩展列表。您可以连接数组以创建新数组。我怀疑 MATLAB 在幕后做同样的事情(制作一个新矩阵)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2011-11-29
  • 2016-11-22
  • 1970-01-01
相关资源
最近更新 更多