Как усреднить элементы в одном массиве на основе значений в другом массиве? - PullRequest
2 голосов
/ 24 февраля 2010
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) и возвращает выходной массив, как показано ниже. Функция отображения в этом примере взяла бы 2,3,4 и 5 в sortedArrayRanks и увидела бы, что все они имеют одинаковое значение в sortedArray, и вместо этого заменила бы все эти числа в выходном массиве их средним значением (которое составляет 3,5 )

Что меня сбивает с толку, так это то, использовать ли рекурсию или обязательный цикл, например, цикл через отсортированный массив, и посмотреть, является ли элемент тем же, что предшествовал ему, а затем, если он совпадает, проверить тот, что перед ним, и т. Д. Как это можно решить? Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 февраля 2010

Это выглядит очень похоже на F # Как оценить проценты в массиве пар? . Вот вариант моего ответа на этот вопрос:

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 голосов
/ 24 февраля 2010

Вы можете:

  • элементы zip и их ранги
  • сгруппировать эти пары по значению элемента
  • средние звания группы
  • результат формы в виде массива

И запишите этот алгоритм в виде сценария:

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|]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...