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

How do I find many maximums in a list in Mathematica

我有一些数据正在尝试分析,它有很多周期,其中 returns 达到最大值。我希望能够 select 并提取所有这些最大值并绘制趋势线以查看它是否具有良好的耐用性。

我的问题很像 This Question 但我的分段不统一

数据以制表符分隔格式存储 {Timestamp,data,data,data,data,data,cycle#,boolean} 我已经知道它能够用这段代码拉出每个周期,但我如何同时获得最大值?

#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 &]

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

这是数据文件的示例

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

<<< 编辑 >>>> 这是我一直在尝试但无法完全正常工作的更新代码

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]]

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

我不确定我是否理解您的所有问题,但也许这会让您解释我所缺少的内容。

这个

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&]

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

如果您能说明最后一步需要做什么,我会尽力完成。

<<< 编辑 >>>

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

所以这是我的想法:

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

2:现在您想要 "do the same thing to every item",其中每个项目都是步骤 1 中的行组。在 Mathematica 中,这通常最好使用 Map 函数来完成。在帮助页面中查找。您要做的是 Max 函数,您需要了解如何使用下标获取第三列。这应该给你最大值列表。 Map 会将所有这些结果放入一个列表中,这样您就可以免费获得第 3 步。

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

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

感谢 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]];