我有一些数据,我试图分析,它有许多循环,它返回到一个最大值。我希望能够选择和提取所有这些最大值,并建立一个趋势线,看看它是否有良好的耐用性。
我的问题很像This Question,但我的分段不一致
数据是以标签分隔格式{时间戳、数据、cycle#、布尔}存储的--我让它能够用这段代码提取每个循环,但是如何同时得到最大值呢?
#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]]
发布于 2015-07-02 02:41:07
谢谢你提供的样本数据,这总是有帮助的。
我不确定我能理解你所有的问题,但也许这会让你解释我错过了什么。
这
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&]用cycles==1提取那些行。
这将提取最大正向流。
maxff = Max @@ forwardflow还有这个
Select[rawl, #[[3]] == maxff&]查找前向流等于该最大值的所有行。
如果您能够澄清您需要做的最后一步,那么我将尝试完成这一步。
<<<编辑>>>
你对这个过程的最新描述更有帮助。
所以我的想法是:
1:您希望在第7列中对具有相同编号的项进行分组。在“帮助”页中查找“拆分”。查看示例,了解如何在有多列行时对某一特定列进行分组。这将使每个组在一个额外的{}层内,而所有组将位于{}的外层。
2:现在您想要“对每个项执行相同的操作”,其中每个项都是步骤1中的行组。在Mathematica中,这通常最好使用Map函数来完成。在帮助页上查一下。您想要做的是Max函数,您需要了解如何使用订阅获得第三列。这应该会给你maxima的列表。地图会把所有的结果放到一个列表中,这样你就可以免费得到第三步了。
他说:然后你可以画出最终的列表。
所以看看这是否给了你足够的想法让你开始。如果你找不出这门语言的某些部分,那就让我知道,我再给你一个提示。
发布于 2015-07-20 17:28:37
多亏了比尔,这就是我想出来的,它就像一种魅力,比任何有than循环的东西都要快得多。
(*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]];https://stackoverflow.com/questions/31167379
复制相似问题