f#获取float数组中所有NaN的索引

时间:2015-01-21 13:25:07

标签: f#

我对f#比较新,还在学习。我正在尝试编写一个函数,它将float数组的所有NAN的索引作为int数组选项返回。

let arr = [1.0; 2.0; nan: 2.0; 4.5; nan; nan; 3.0;]

我有一个fct,它使用Array.tryFindIndex返回第一个nan的索引。 但是现在我陷入了困境,并且不知道该如何做才能让其他人从数组中获得数据。 这就是我的代码:

let indexOfOneNan (arr:array<float>) =
    arr
    |> Array.tryFindIndex (fun f -> nan.Equals(f))
    |> fun b -> match b with
            | Some (x) -> Some ([|x|])
            | None     -> None

1 个答案:

答案 0 :(得分:4)

当然可以重复应用谓词,以便检索满足它的所有元素而不仅仅是第一个,但它将涉及为每个步骤分配新数组。这不会非常有效。

您可以使用Array.mapi投影,它将索引与每个元素一起传递给谓词,并删除所有不满足谓词Array.choose的元素。

let arr = [|1.0; 2.0; nan; 2.0; 4.5; nan; nan; 3.0;|]

arr
|> Array.mapi (fun i f ->
    if System.Double.IsNaN f then Some i else None )
|> Array.choose id
// val it : int [] = [|2; 5; 6|]

编辑:

或者,您可以根据f# specarray sequence expression使用array comprehension,通俗地说。对于这类问题,它们通常更简洁。

[| for i, f in Array.mapi (fun i f -> i, f) arr do
    if System.Double.IsNaN f then yield i |]
// val it : int [] = [|2; 5; 6|]