2012-10-15 31 views
2

我經常將電子表格導入Mathematica進行分析,並且無法編碼一種簡單的方法來選擇用於分析的非順序元素。例如,如果我導入一個包含20列和100行的電子表格,我通常需要刪除選定的行/列。在Mathematica中從列表中選擇非順序元素

在這個例子中,我需要所有的行和列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} ]] 

是否有可能使用量程(;;)選擇列的塊( 7-17),同時在我的例子中選擇第2和第4行?

+0

我想你的意思「同時也選擇第2列和第4列「 –

+0

是的,我的意思是專欄。對不起,這個錯誤。 –

回答

1

x ;; y語法是Part的特殊參數,而不是可用於構建列表的一般語法。所以你可以說v [[All,7 ;; 17]],但不是v [[All,{7 ;; 17}]] - 後者既不是整數列表,也不是Part可識別的特殊語法。

但它很容易解決你的問題。你可以試試:

v[[All, {2,4}~Join~Table[x,{x,7,17}] ]] 

例如,或

Join[v[[All, {2, 4}]], v[[All, 7 ;; 17]], 2] 

祝你好運!

+0

謝謝。這是有益的 –

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 = [email protected] ~Partition~ 4; 

part[a, {1 ;; 3, 6}, {1, 3 ;; 4}] 
{{1, 3, 4}, {5, 7, 8}, {9, 11, 12}, {21, 23, 24}} 

這使得任何試圖處理這將是複雜得多負索引跨越,但也許至少是有益的給你一些想法。

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}