从Mathematica中的列表中选择非顺序元素

时间:2012-10-15 23:46:20

标签: wolfram-mathematica

我经常将电子表格导入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行?

3 个答案:

答案 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)

这是PartSpan的已知限制。看看我自己密切相关的问题:

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}