2010-02-24 48 views
2
let tiedArray = [|9.4;1.2;-3.4;-3.4;-3.4;-3.4;-10.0|]; 

let sortedArray = [|-10.0;-3.4;-3.4;-3.4;-3.4;1.2;9.4|]; 
let sortedArrayRanks = [|1.;2.;3.;4.;5.;6.;7.|]; 

let desired_ranked_array = [|1.;3.5;3.5;3.5;3.5;6.;7.|] 

hello-如何根据另一个数组中的值来平均一个数组中的元素?

我试图写一个函数,采用2门阵列(sortedArray和sortedArrayRanks),并返回一个输出阵列如下面的一个。在这个例子中的映射函数将在sortedArrayRanks中使用2,3,4和5,并且看到它们在sortedArray中都具有相同的值,而是用输出数组中的所有数字替换它们的平均值(这是3.5 )

让我感到沮丧的是,是否使用递归或命令式循环构造,如循环遍历排序数组,并查看一个项是否与之前的项相同,然后如果匹配,请检查它之前的项等等,这怎么解决?谢谢!

+2

@Foredecker,你为什么添加该标签时没有任何问题的标记是作业? – Dykam 2010-02-24 19:53:08

回答

2

这看起来很像F# How to Percentile Rank An Array of Doubles?。下面是我的回答这个问题的变化:

let rank arr (ranks:float[]) = 
let rev = Array.rev arr 
let len = Array.length arr 
let first x = Array.findIndex (fun y -> y = x) arr 
let last x = len - (Array.findIndex (fun y -> y = x) rev) - 1 
let avgR x = ranks.[(first x) .. (last x)] |> Array.average 
Array.map avgR arr 

这假定arr进行排序,并在arr支持相等比较的元素。

+0

这是非常漂亮的代码。爱它。做得好。 – 2010-02-24 20:03:53

0

您可以:

  • 拉链元素和他们的行列
  • 组这些对由元素的值
  • 均线组排
  • 形式的结果阵列

,并写下这算法脚本:

let f sortedArray sortedArrayRanks = 
    [| 
    for v,xs in Array.zip sortedArray sortedArrayRanks |> Seq.groupBy (fun (v,r) -> v) do 
     let n,r = Seq.fold (fun (n,r) (_,r') -> (n+1,r+r')) (0,0.) xs 
     let r = r/(float n) 
     for i in 1..n do yield r 
    |] 

> f [|-10.0;-3.4;-3.4;-3.4;-3.4;1.2;9.4|] [|1.;2.;3.;4.;5.;6.;7.|];; 
val it : float [] = [|1.0; 3.5; 3.5; 3.5; 3.5; 6.0; 7.0|] 
相关问题