gpt4 book ai didi

data-structures - Mathematica 中的条件数据操作

转载 作者:行者123 更新时间:2023-12-04 06:26:28 25 4
gpt4 key购买 nike

我正在尝试准备 高效数据分析的最佳工具 在 Mathematica 中。
我有大约 300 列和 100 000 行。

什么是最好的技巧:

“删除”、“提取”或简单地“考虑”数据结构的一部分,用于绘制例如

我能想到的最棘手的例子之一是:

Given a data structure,

Extract Column 1 to 3, 6 to 9 as well as the last One for every lines where the value in Column 2 is equal to x and the value in column 8 is different than y



我也欢迎任何关于数据操作的一般性建议。

最佳答案

要对具有命名列的表中的数据进行一般操作,请参阅 this我的解决方案,对于类似的问题。对于任何特定情况,为 Select 编写函数可能更容易手动。但是,对于许多列和许多不同的查询,弄乱索引的可能性很高。这是来自上述帖子的修改后的解决方案,它提供了更友好的语法:

Clear[getIds];
getIds[table : {colNames_List, rows__List}] := {rows}[[All, 1]];

ClearAll[select, where];
SetAttributes[where, HoldAll];
select[cnames_List, from[table : {colNames_List, rows__List}], where[condition_]] :=
With[{colRules = Dispatch[ Thread[colNames -> Thread[Slot[Range[Length[colNames]]]]]],
indexRules = Dispatch[Thread[colNames -> Range[Length[colNames]]]]},
With[{selF = Apply[Function, Hold[condition] /. colRules]},
Select[{rows}, selF @@ # &][[All, cnames /. indexRules]]]];

这里发生的是 Select中使用的函数根据您的规范自动生成。例如(使用@Yoda 的例子):
rows = Array[#1 #2 &, {5, 15}];

我们需要定义列名(必须是字符串或没有值的符号):
In[425]:= 
colnames = "c" <> ToString[#] & /@ Range[15]

Out[425]= {"c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11", "c12",
"c13", "c14", "c15"}

(实际上,当然,名称通常更具描述性)。这是表:
table = Prepend[rows, colnames];

这是您需要的选择语句(我选择了 x = 4y=2 ):
select[{"c1", "c2", "c3", "c6", "c7", "c8", "c9", "c15"}, from[table],
where["c2" == 4 && "c8" != 2]]

{{2, 4, 6, 12, 14, 16, 18, 30}}

现在,对于单个查询,这可能看起来是一种复杂的方法。但是你可以做很多不同的查询,比如
In[468]:= select[{"c1", "c2", "c3"}, from[table], where[EvenQ["c2"] && "c10" > 10]]

Out[468]= {{2, 4, 6}, {3, 6, 9}, {4, 8, 12}, {5, 10, 15}}

和类似的。

当然,如果您的数据中有特定的相关性,您可能会发现特定的专用算法会更快。上面的函数可以通过多种方式扩展,以简化常见查询(包括“all”等),或者自动编译生成的纯函数(如果可能)。

编辑

在哲学上,我相信许多 Mathematica 用户(包括我自己)发现自己时不时会一次又一次地编写类似的代码。 Mathematica 具有简洁的语法这一事实使得它对于任何特定情况的编写通常非常容易。但是,只要在某个特定领域工作(例如,表中的数据操作),许多操作的重复成本就会很高。我的示例在一个非常简单的设置中说明的是一种可能的出路 - 创建域特定语言 (DSL)。为此,通常需要为其定义语法/语法,并将编译器从它编写到 Mathematica(以自动生成 Mathematica 代码)。现在,上面的例子是这个想法的一个非常原始的实现,但我的观点是 Mathematica 通常非常适合 DSL 创建,我认为这是一种非常强大的技术。

关于data-structures - Mathematica 中的条件数据操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6130276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com