2

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

4

3 回答 3

1

the x ;; y syntax is a special argument to Part, not a general syntax that can be used to build lists. So you could say v[[ All, 7;;17 ]], but not v[[All, {7;;17}]] -- the latter is neither a list of integers nor a special syntax recognizable by Part.

But it is pretty easy to solve your problem. You can try:

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

for example, or

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

Good luck!

于 2012-10-16T05:45:55.197 回答
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 }

于 2012-10-16T15:14:38.170 回答
0

这是Part和的一个已知限制Span。请参阅我自己密切相关的问题:

Part and Span:这*不应该*有什么原因吗?

您的解决方案是最常见的解决方法。如果您发现构建索引列表太不方便,您可以尝试使用自定义 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}}

这不会尝试处理会复杂得多的负索引 Span,但至少可以为您提供一些想法。

于 2012-10-16T13:19:30.327 回答