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

f# get index of all NaNs in a float array

我对 f# 比较陌生,仍在学习中。我正在尝试编写一个函数,该函数 returns 浮点数组的所有 NAN 的索引作为 int 数组选项。

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

我有一个事实,returns 使用 Array.tryFindIndex 的第一个 nan 的索引。 但是现在我被卡住了,不知道该怎么做才能让另一个 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

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

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

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 comprehension 中的 array sequence expression。对于这类问题,他们往往更简洁。

[| 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|]