Part和Span:这个*应该*不起作用的原因是什么?

Mr.*_*ard 4 syntax wolfram-mathematica

这是设计问题,而不是现有功能问题.

我想用:

{1, 2, 3, 4, 5}[[{1 ;; 3, 2 ;; 5}]]
Run Code Online (Sandbox Code Playgroud)

我预计:

{{1, 2, 3}, {2, 3, 4, 5}}
Run Code Online (Sandbox Code Playgroud)

但它无效:

During evaluation of In[1]:= Part::pspec: Part specification {1;;3,2;;5} is neither an integer nor a list of integers. >>
Run Code Online (Sandbox Code Playgroud)

我不是问为什么这不起作用(简单:它不受支持).

相反,它是否有理由不起作用?也就是说,是否存在不支持此的逻辑原因?


顺便说一句,我特别没有询问嵌套列表语法如:

{1, 2, 3, 4, 5}[[{{1, 2, 3}, {2, 3, 4, 5}}]]
Run Code Online (Sandbox Code Playgroud)

因为我认为这种情况不那么"规律",而且更加不稳定,而且Span更加明确和控制.

Leo*_*rin 7

我认为你问的真正问题是为什么这不起作用:

In[15]:= {1,2,3,4,5}[[{{1,2,3},{2,3,4,5}}]]

During evaluation of In[15]:= Part::pspec: Part specification 
{{1,2,3},{2,3,4,5}} is neither an integer nor a list of integers. >>

Out[15]= {1,2,3,4,5}[[{{1,2,3},{2,3,4,5}}]]
Run Code Online (Sandbox Code Playgroud)

因为它Span似乎是一个更高级别的包装器Part(这是一个猜测).最近在MathGroup上也提出了同样的问题 .没有一个令人满意的答案,我的感觉是,从用户的角度来看,这只是一个遗漏 - 我没有看到为什么这不起作用的根本原因.而且,这个功能在某些情况下会让生活变得更轻松.

从技术/实现的角度来看,我可以推测这与扩展的Part赋值功能不一致.具体来说,我们知道不仅Part可以用于元素提取,还可以用于有效的元素分配,其中可以同时分配整个常规结构(矩形子矩阵),例如

In[18]:= 
a = Table[i+j,{i,2},{j,4}]

Out[18]= {{2,3,4,5},{3,4,5,6}}

In[21]:= 
a[[All,{2,3}]] = {{7,8},{9,10}};
a

Out[22]= {{2,7,8,5},{3,9,10,6}}
Run Code Online (Sandbox Code Playgroud)

应该Part允许位置的嵌套列表规范,它应该立即为非矩形子结构提供赋值功能,否则它将变得不那么直观(因为会有角落情况等).我怀疑后者不容易实现,因为扩展的Part赋值功能可能直接基于数组内存布局.这也会产生打包数组的问题(出于同样的原因 - 它们不能是粗糙的,必须是矩形的).也许,如果Mathematica内置了非常有效的粗糙数组结构(如链表),这可以解决.

总而言之:看起来,从实现的角度来看,这样的新功能会引入一些棘手的问题,这可以解释为什么还没有完成(再次,这是猜测).还要注意,对于元素提取,可以使用Extract准备好的位置列表,提取任意子结构,这几乎与使用时一样有效Part.

  • @ Mr.Wizard是的,你可以限制 - 但这会产生极端情况并且不是优雅的设计,IMO,此外,这仍然无法解决我提到的实施问题.OTOH,如果这些问题得到解决,可能也会允许一般形式.我并不反对在许多情况下,"Span"是一个更直接的习惯用语,只是说这里有一个更普遍的设计问题. (3认同)
  • @ Mr.Wizard如果允许简单的"Span"-s列表,则没有理由不允许它们的嵌套列表(从一般设计角度来看).但是,在这里,我们去(与你的表达不太相似但相似):`a [[{{1 ;; 1,{2 ;; 2}},3 ;; 3,{{4 ;; 4}} ]`. (2认同)