我经常将电子表格导入Mathematica进行分析,并且无法编码选择非顺序元素进行分析的简单方法。例如,如果我导入一个包含20列和100行的电子表格,我通常需要删除选定的行/列。
在这个例子中,我需要所有的行和列2,4,7-17。以下代码应该可以正常工作,但会导致错误:
v[[ All, {2,4,7;;17} ]]
相反,我一直在使用:
v[[ All, {2,4,7,8,9,10,11,12,13,14,15,16,17} ]]
是否可以使用Span(;;)选择列块(7-17),同时在我的示例中选择第2行和第4行?
答案 0 :(得分:1)
x ;; y语法是Part的特殊参数,而不是可用于构建列表的一般语法。所以你可以说v [[All,7 ;; 17]],但不是v [[All,{7 ;; 17}]] - 后者既不是整数列表也不是Part可识别的特殊语法。 / p>
但解决问题非常容易。你可以尝试:
v[[All, {2,4}~Join~Table[x,{x,7,17}] ]]
例如,或
Join[v[[All, {2, 4}]], v[[All, 7 ;; 17]], 2]
祝你好运!
答案 1 :(得分:0)
这是Part
和Span
的已知限制。看看我自己密切相关的问题:
Part and Span: is there a reason this *should* not work?
您的解决方案是最常见的解决方法。如果您发现构建索引列表太不方便,可以尝试使用自定义Part函数使其更容易。例如:
SetAttributes[part, HoldFirst]
part[x_, parts__] := x[[##]] & @@ Flatten /@ ({parts} /. Span -> Range)
使用:
a = Range@24 ~Partition~ 4;
part[a, {1 ;; 3, 6}, {1, 3 ;; 4}]
{{1, 3, 4}, {5, 7, 8}, {9, 11, 12}, {21, 23, 24}}
这并没有尝试处理负面索引Spans,这会更复杂,但也许它至少可以为你提供一些想法。
答案 2 :(得分:0)
另一种方法..
pys[{all___}] :=
Flatten[(Switch[Head[#], Span,
Range @@ (# /. Span -> List), __, #]) & /@ {all}]
list = Range[100];
list[[pys[{1, 3 ;; 12 ;; 2, 19, -3 ;; -1}] ]]
{1, 3, 5, 7, 9, 11, 19, 98, 99, 100}
这显然不能处理开放端{1,3 ;;}或混合+/-跨度{5;; - 5}