f# - 将 float[,] 转换为 f# 中的列表?

标签 f#

我有一个可以很好地处理列表的函数,但是该函数的输入为 float[,]来自外部系统/语言。

我读到this但是当我应用这个时,我收到错误 float[,] is not compatible with Seq<a'> 。然而这个列表也只是 float 。

列表功能:

let aggrArraysL data =
    data
    |> Seq.groupBy (fun (a, b, c) -> a)
    |> Seq.map (fun (key, group) ->
        group |> Seq.reduce (fun (a, b, c) (x, y, z) -> a, b + y, (b * c + y * z * 1.)/(b + y)))

数组尝试:

let aggrArrays (data2 : float[,]) =
    data2
    |> Seq.toList
    |> Seq.groupBy (fun (a, b, c) -> a)
    |> Seq.map (fun (key, group) ->
        group |> Seq.reduce (fun (a, b, c) (x, y, z) -> a, b + y, (b * c + y * z * 1.)/(b + y)))
    |> Seq.toArray

我哪里出错了?谢谢!

最佳答案

二维数组实现 IEnumerable所以你可以使用 Seq.cast<T> 来转换它们:

let toList (data2: float[,]) = data2 |> Seq.cast<float> |> Seq.toList

您可能希望使其通用:

let toList<'a> (data2: 'a [,]) = data2 |> Seq.cast<'a> |> Seq.toList

编辑:看起来您想要将数组映射到行元素列表中,而不是将其展平。在这种情况下你可以这样做:

let aggrArrays (data2:float[,])  =
    [0 .. (Array2D.length1 data2) - 1]
    |> List.map (fun i -> (data2.[i, 0], data2.[i, 1], data2.[i, 2]))
    |> Seq.groupBy id
    |> Seq.map (fun (key, group) -> group |> Seq.reduce (fun (a,b,c) (x, y, z) -> a, b+y , (b*c+y*z*1.)/(b+y)))
    |> Seq.toArray

关于f# - 将 float[,] 转换为 f# 中的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19348254/

相关文章:

f# - 如何在没有 "let rec"的情况下定义 y-combinator ?

generics - f# 可区分联合泛型

silverlight - 如何在 F# 中创建一个包含图像和文本的按钮?

f# - 统一 Task<T> 和 F# MailboxProcessor 异常处理

f# - 如何在 F# 模块中定义可选参数?

f# - F# 中带有浮点迭代器的列表推导式

asynchronous - 从 C# 调用非异步 Func<T> 返回 F# 函数中的启动 Async<T>?

c# - F# 等效于 C# 'object' 关键字

design-patterns - 具有 protected 创建和公共(public)读取访问权限的可区分联合的功能设计模式是什么?

c# - 当字段名称是保留关键字时从 F# 访问 .Net 字段