我认为您问的真正问题是为什么这不起作用:
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}}]]
because Span
似乎是在之上实现的更高级的包装器Part
(这是一个猜测)。同样的问题已被询问 http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/thread/192d515c3bc505fe/a599b820dfdc026b最近在 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}}
Should Part
允许位置的嵌套列表规范,它应该立即为非矩形子结构提供分配功能,否则使用起来会变得不太直观(因为会有极端情况等)。而且我怀疑后者不容易实现,因为扩展Part
分配功能可能直接基于数组内存布局。这也会给打包数组带来问题(出于同样的原因 - 它们不能是参差不齐的,必须是矩形的)。也许,Mathematica 应该内置非常高效的参差不齐的数组结构(如链表),这个问题就可以解决。
所以,总结一下:从实现的角度来看,这样的新功能似乎会引入几个棘手的问题,这可以解释为什么还没有这样做(同样,这是一个猜测)。另请注意,对于元素提取,可以使用Extract
使用准备好的位置列表来提取任意子结构,这几乎与使用Part
.