如何在Mathematica的列表中找到许多最大值

时间:2015-07-01 16:55:47

标签: list select max wolfram-mathematica

我有一些我试图分析的数据,它有很多循环,它会返回到最大值。我希望能够选择并拉出所有这些最大值并制作趋势线以确定它是否具有良好的耐用性。

我的问题很像This Question,但我的细分不均匀

数据以制表符分隔格式存储{时间戳,数据,数据,数据,数据,数据,循环#,布尔} 我已经知道能够使用此代码拉出每个周期,但我如何同时获得最大值?

#Importing the List#
SetDirectory[NotebookDirectory[]] 
rawl = Import["SU8-20-50psi-6-29.txt", "TSV"];
date = {rawl[[4]][[1]]}
pressure = {rawl[[4]][[2]]};
forwardflow = {rawl[[4]][[3]]};
backwashflow = {rawl[[4]][[4]]};
forwardpressure = {rawl[[4]][[5]]};
backwashpressure = {rawl[[4]][[6]]};
cycles = {rawl[[4]][[7]]};
backwash = {rawl[[4]][[8]]};

length = Length[rawl]

iter = 4;

While[iter < length,
 iter = iter + 1;
 AppendTo[date, rawl[[iter]][[1]]];
 AppendTo[pressure, rawl[[iter]][[2]]];
 AppendTo[forwardflow, rawl[[iter]][[3]]];
 AppendTo[backwashflow, rawl[[iter]][[4]]];
 AppendTo[forwardpressure, rawl[[iter]][[5]]];
 AppendTo[backwashpressure, rawl[[iter]][[6]]];
 AppendTo[cycles, rawl[[iter]][[7]]];
 AppendTo[backwash, rawl[[iter]][[8]]]]

Select[rawl, #[[]][[7]] == 1 &]

我正在寻找第3个数据点的最大值

这是数据文件的示例

2015-06-30 16:11:15.628563  0.5 0.7 0.0 11.1    41.2    0   False
2015-06-30 16:11:15.889830  0.9 0.3 0.0 7.7 42.6    0   False
2015-06-30 16:11:16.090567  1.5 0.6 0.0 5.3 43.2    0   True
2015-06-30 16:11:16.338970  1.4 1.0 0.0 7.2 43.2    0   True
2015-06-30 16:11:16.456993  1.4 1.4 0.0 9.6 43.2    0   True
2015-06-30 16:11:16.580034  1.4 1.0 0.0 11.6    43.7    0   True
2015-06-30 16:11:16.692873  1.5 1.0 0.0 13.7    43.7    0   True
2015-06-30 16:11:16.804827  1.5 0.6 0.0 15.0    43.6    1   False
2015-06-30 16:11:16.937007  1.6 0.4 0.0 15.7    43.7    1   True
2015-06-30 16:11:17.047861  1.6 0.0 0.0 15.8    43.6    1   True
2015-06-30 16:11:17.158619  1.6 0.0 0.0 15.8    43.7    1   True
2015-06-30 16:11:17.293030  1.5 0.0 0.0 15.7    43.9    1   True
2015-06-30 16:11:17.404268  1.5 0.0 0.0 15.7    44.0    1   True
2015-06-30 16:11:17.514991  1.5 0.0 0.0 15.6    44.8    1   True
2015-06-30 16:11:17.650058  1.5 0.0 0.0 15.7    44.7    1   True
2015-06-30 16:11:17.761827  1.5 0.0 0.0 15.7    44.7    1   True
2015-06-30 16:11:17.872931  1.8 0.0 0.0 15.7    44.1    2   False
2015-06-30 16:11:18.112676  0.4 0.0 0.0 15.0    42.4    2   False

&LT;&LT;&LT;编辑&gt;&gt;&gt;&gt;这是我一直在尝试的更新代码,但无法使其正常工作

groups = Split[rawl, #1[[7]] == #2[[7]] &]; (* this works great*) group = Max[groups[[3]][[All, 3]]] (*This works too*) Map[Max, groups[[#]][[All, 3]]] & (*So why wont these work?*) Transpose[MapAt[Max /@ # &, Transpose[groups], 3]]

2 个答案:

答案 0 :(得分:0)

感谢您提供示例数据,这总是有帮助的。

我不确定我理解你的所有问题,但也许这会让你解释我所缺少的东西。

rawl = Import["psi.txt", "TSV"];
rawl = Drop[rawl, 3];(*drop unwanted header rows?*)
{date, pressure, forwardflow, backwashflow, forwardpressure, 
  backwashpressure, cycles, backwash} = Transpose[rawl]

提取列并将数据存储在变量中。

Select[rawl, #[[7]] == 1&]

使用周期== 1提取这些行。

这提取了最大正向流量

maxff = Max @@ forwardflow

和这个

Select[rawl, #[[3]] == maxff&]

查找正向流量等于该最大值的所有行。

如果你可以澄清你需要做的最后一步,那么我会尝试完成这个。

&LT;&LT;&LT;编辑&gt;&gt;&gt;

您对该过程的最新描述更有帮助。

所以这是我的想法:

1:您想要在第7列中对具有相同编号的项目进行分组。在帮助页面中查找Split。查看示例,了解当您有多列行时如何对一个特定列进行分组。这将为您提供额外的{}层内的每个组,并且所有组都将位于{}的外层内。

2:现在你想“对每个项目做同样的事情”,其中每个项目都是步骤1中的行组。在Mathematica中,这通常最好用Map函数完成。在帮助页面中查找。你想要做的是Max函数,你需要看看如何使用下标获取第三列。这应该给你最大值列表。并且Map会将所有这些结果放入列表中,以便您免费获得第3步。

4:然后你可以绘制结果列表。

所以看看这是否足以让你有一个想法让你开始。如果您无法弄清楚该语言的某些部分,请告诉我,我会给出另一个提示。

答案 1 :(得分:0)

感谢Bill,这就是我想出来的,它就像一个魅力,并且比使用While循环的任何东西都快。

(*import the data*)
rawl = Import["SU8-MA7.txt", "TSV"];
rawl = Drop[rawl, 3];(*drop unwanted header rows*)
{date, pressure, forwardflow, backwashflow, forwardpressure, backwashpressure, cycles, backwash} = Transpose[rawl];

(*Split it into groups and get the maximum of each group*)
totalcycles = Max[cycles]
groups = Split[rawl, #1[[7]] == #2[[7]] &];
f[group_] := Max[groups[[group]][[All, 3]]]
maximum = Map[f, Range[1, totalcycles]];