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# spec 或 array 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|]
我对 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# spec 或 array 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|]