gpt4 book ai didi

scala - 在 Scala 中对数组进行插值

转载 作者:行者123 更新时间:2023-12-01 22:57:34 25 4
gpt4 key购买 nike

我正在尝试线性插值Array[Option[Long]]。例如给出:

val example1 = Array(Some(20l), None, Some(60l))
val example2 = Array(Some(20l), None, None, Some(80l))
val example3 = Array(Some(20l), None, None, Some(80l), Some(90l), Some(100l))
val example4 = Array(Some(20l), None, None, Some(80l), None, Some(82l))

我期待:

val example1Interpolated = Array(20l, 40l, 60l)
val example2Interpolated = Array(20l, 40l, 60l, 80l)
val example3Interpolated = Array(20l, 40l, 60l, 80l, 90l, 100l)
val example4Interpolated = Array(20l, 40l, 60l, 80l, 81l, 82l)

集合中的元素之间没有关系(例如 example4)。然而,这些值是单调递增的。

对于熟悉 Python 的人,我正在寻找与以下内容等效的 Scala:

def interpolate(input_):
nans = np.isnan(input_)
get_index = lambda z: z.nonzero()[0]
input_[nans] = np.interp(get_index(nans), get_index(~nans), input_[~nans])
return input_

用于:

interpolate(np.array([20, np.nan, 60]))
interpolate(np.array([20, np.nan, np.nan, 80]))
interpolate(np.array([20, np.nan, np.nan, 80, np.nan, 82]))

产量:

array([ 20.,  40.,  60.])
array([ 20., 40., 60., 80.])
array([ 20., 40., 60., 80., 81., 82.])

最佳答案

即使存在前导或尾随 None,只要列表中至少有一个元素为 Some(_),此函数就会起作用。它在Integral 类型中也是通用的。 (如果您愿意,您可以使其在 Fractional 类型之间通用。)

def interpolate[T](list: Iterable[Option[T]])(implicit num: Integral[T]) = {
import num._
val prevs = list.zipWithIndex.scanLeft(Option.empty[(T, Int)]) {
case (prev, (cur, i)) => cur.map((_, i)).orElse(prev)
}
val nexts = list.zipWithIndex.scanRight(Option.empty[(T, Int)]) {
case ((cur, i), next) => cur.map((_, i)).orElse(next)
}
prevs.tail.zip(nexts).zipWithIndex.map {
case ((Some((prev, i)), Some((next, j))), k) =>
if (i == j) prev else prev + (next - prev) * fromInt(k - i) / fromInt(j - i)
case ((Some((prev, _)), _), _) => prev
case ((_, Some((next, _))), _) => next
}
}

这构建了 prevs,它跟踪最新的 Some(_) 及其左侧的索引,以及 nexts,右边也是一样的。然后,并行迭代 prevsnexts,它根据左、右和索引生成插值。如果左侧或右侧缺失,则从另一侧填写即可。

关于scala - 在 Scala 中对数组进行插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43643822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com