2015-05-09 2 views
1

У меня есть следующая проблема, и я надеюсь, что кто-то может мне помочь.F # подходящий контейнер для (струна, поплавок, поплавок) триады?

Краткое описание проблемы: мне нужно сохранить триаду (строка A, поплавок B, поплавок C) в подходящий контейнер. Триада исходит из двойного цикла «за». Но главное, что мне нужно будет срезать этот контейнер, когда петли закончили, чтобы выполнить другие операции.

Далее следует пример, который может быть выполнен из оболочки .fsx (с использованием кадров Deedle). Триада - это то, что напечатано на экране.

open Deedle 

let categorical_variable = [| "A"; "B"; "C"; "A"; "B"; "C"; |] 
let vec_1 = [| 15.5; 14.3; 15.5; 14.3; 15.5; 14.3; |] 
let vec_2 = [| 114.3; 17.5; 9.3; 88.7; 115.5; 12.3; |] 

let dframe = frame ["cat" =?> Series.ofValues categorical_variable 
        "v1" =?> Series.ofValues vec_1 
        "v2" =?> Series.ofValues vec_2 ] 

let distinct_categorical_variables = categorical_variable |> Array.toSeq |> Seq.distinct |> Seq.toArray 

let mutable frame_slice : Frame<int, string> = Frame.ofRows [] 
let mutable frame_slice_vec_1 : float[] = Array.empty 
let mutable frame_slice_vec_1_distinct : float[] = Array.empty 

for cat_var in distinct_categorical_variables do 

    frame_slice <- (dframe |> Frame.filterRowValues (fun row -> row.GetAs "cat" = cat_var)) 
    frame_slice_vec_1 <- (frame_slice?v1).Values |> Seq.toArray 
    frame_slice_vec_1_distinct <- (frame_slice_vec_1 |> Array.toSeq |> Seq.distinct |> Seq.toArray) 

    for vec_1_iter in frame_slice_vec_1_distinct do 

     printfn "%s, %f, %f \n" cat_var vec_1_iter (Array.average ((frame_slice?v2).Values |> Seq.toArray)) |> ignore 

Итак, есть ли подходящий объект, где хранить эту триаду? Я видел объекты Array3d, но я не думаю, что они являются правильным решением, потому что A, B и C моей триады имеют разные типы.

Большое спасибо заранее.

ответ

2

вы, вероятно, хотите sequence expression с tuples:

let mySequence = 
    seq { for cat_var in distinct_categorical_variables do 
      ... 
      for vec_1_iter in ... do 
      yield cat_var, vec_1_iter, Array.average ... } 

// then use it like 
for cat_var, vec_1_iter, result in mySequence do 
    ... 
+0

Спасибо, что решить мою проблему. – tinoswe

+0

@tinoswe Обратите внимание, что вы также можете вызвать 'Seq.toList'. Как есть, сырой «seq» ленив, а это означает, что он будет пересчитываться каждый раз, когда вы перебираете его. Если вы сделаете его «списком», он сохранит результаты в памяти, а не пересчитывает. (Что может быть или не быть желательным в зависимости от ограничений вашей памяти). –

+0

Хорошо, спасибо за разъяснение. – tinoswe

Смежные вопросы