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
  ...
Другие вопросы по тегам