我有一个可以很好地处理列表的函数,但是该函数的输入为 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/