一千萬個為什麽

搜索

如何查找具有最大值的行?

假設我有以下列表 { {10,b,30}, {100,a,40}, {1000,b,10}, {1000,b,70}, {100,b,20}, {10,b,70} }

在這種情況下,如何查找第3列中具有最大值的行 ({{1000,b,70},{10,b,70}})

最佳答案

附: dat = {{10, b, 30}, {100, a, 40}, {1000, b, 10}, {1000, b, 70}, {100, b, 20}, {10, b, 70}};

也許最直接的: Cases[dat, {_, _, [email protected][[All, 3]]}]

更多方法:

Last @ SplitBy[SortBy[dat, {#[[3]] &}], #[[3]] &]

Pick[dat, #, [email protected]#] &@dat[[All, 3]]

Reap[Fold[(If[#2[[3]] >= #, [email protected]#2]; #2[[3]]) &, dat]][[2, 1]]

這些 Pick 看起來簡潔而高效,所以這是我的建議。 Edit: Position and Extract are three times as efficient as Pick on some data. Using Transpose is slightly more efficient on packed rectangular data.

dat ~Extract~ Position[#, [email protected]#] & @ dat[[All, 3]]

dat ~Extract~ Position[#, [email protected]#] & @ Part[dat[Transpose], 3]

以下是版本7中執行的一些時間安排: SetAttributes[timeAvg, HoldFirst] timeAvg[func_] := Do[If[# > 0.3, Return[#/5^i]] & @@ [email protected][func, {5^i}], {i, 0, 15}]

SeedRandom[1] dat = RandomInteger[99999, {500000, 3}];

Cases[dat, {_, _, [email protected][[All, 3]]}] //timeAvg [email protected][SortBy[dat, {#[[3]] &}], #[[3]] &] //timeAvg Pick[dat, #, [email protected]#] &@dat[[All, 3]] //timeAvg Reap[Fold[(If[#2[[3]] >= #, [email protected]#2]; #2[[3]]) &, dat]][[2, 1]]//timeAvg dat ~Extract~ Position[#, [email protected]#] &@dat[[All, 3]] //timeAvg dat ~Extract~ Position[#, [email protected]#] &@Part[dat[Transpose], 3] //timeAvg

0.1278       0.764       0.0904       0.904       0.02996       0.02496

(實際上,我重新啟動了內核之間的每個單獨的時間線,否則每次運行變慢,不公平地偏向早期線測試。) 這些可以通過對數字數據使用更快的位置函數進一步優化 邁克爾E2 推薦編譯(可能在7之後的版本中速度更快): pos = Compile[{{list, _Real, 1}, {pat, _Real}}, Position[list, pat]]; dat ~Extract~ pos[#, [email protected]#] & @ Part[dat[Transpose], 3]//timeAvg

0.01372

我的最喜歡的方法是 SparseArray 屬性: spos = SparseArray[Unitize[#], Automatic, 1]["AdjacencyLists"] & dat[[spos[# - [email protected]#]]] & @ Part[dat[Transpose], 3]//timeAvg

0.002872

現在比我的原始建議 Pick 快30倍。

轉載註明原文: 如何查找具有最大值的行?