F# Подходящий контейнер для триад (string, float, float)?
У меня следующая проблема, и я надеюсь, что кто-нибудь сможет мне помочь.
Краткое описание проблемы: мне нужно хранить триаду (строка A, float B, float C) в подходящем контейнере. Триада порождает двойной цикл for. Но существенным моментом является то, что мне нужно будет нарезать этот контейнер по окончании циклов для выполнения других операций.
Ниже приведен пример, который может быть выполнен из оболочки.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 моей триады имеют разные типы.
Спасибо заранее.
1 ответ
Вы, вероятно, хотите получить выражение последовательности с кортежами:
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
...