Wolfram mathematica 从Mathematica中的列表中选择非顺序元素
我经常将电子表格导入Mathematica进行分析,但在编写选择非顺序元素进行分析的简单方法时遇到困难。例如,如果导入一个包含20列和100行的电子表格,通常需要删除选定的行/列 在这个例子中,我需要所有的行和列2,4,7-17。以下代码应该可以正常工作,但会导致错误:Wolfram mathematica 从Mathematica中的列表中选择非顺序元素,wolfram-mathematica,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} ]] 在我的示例中,在选择第2行和第4行的同时,是否可以使用Sp
v[[ All, {2,4,7;;17} ]]
相反,我一直在使用:
v[[ All, {2,4,7,8,9,10,11,12,13,14,15,16,17} ]]
在我的示例中,在选择第2行和第4行的同时,是否可以使用Span(;;)选择一个列块(7-17)?x;;y语法是Part的一个特殊参数,而不是可用于构建列表的通用语法。所以你可以说v[[All,7;;17]],但不能说v[[All,{7;;17}]]——后者既不是一个整数列表,也不是一种可以部分识别的特殊语法 但是解决你的问题很容易。您可以尝试:
v[[All, {2,4}~Join~Table[x,{x,7,17}] ]]
例如,或者
Join[v[[All, {2, 4}]], v[[All, 7 ;; 17]], 2]
祝你好运 这是
零件和Span
的已知限制。请看我自己密切相关的问题:
您的解决方案是最常见的解决方案。如果您发现构建索引列表太不方便,可以尝试使用自定义零件函数使其更容易。例如:
SetAttributes[part, HoldFirst]
part[x_, parts__] := x[[##]] & @@ Flatten /@ ({parts} /. Span -> Range)
使用:
这不需要尝试处理负指数跨度,因为负指数跨度会非常复杂,但至少可以给您一些想法。另一种方法
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}我想你的意思是“同时选择第2列和第4列”是的,我指的是列。对不起,我弄错了。谢谢。这很有帮助
{{1, 3, 4}, {5, 7, 8}, {9, 11, 12}, {21, 23, 24}}
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}