【问题标题】:Scala: merge two arrays in one single structureScala:将两个数组合并到一个结构中
【发布时间】:2017-01-20 19:06:30
【问题描述】:

我有两个数组:

val diceProbDist = new Array[Double](2 * DICE + 1)

val diceExpDist = new Array[Double](2 * DICE + 1)

我想合并成一个单一的结构(可能是某种元组):

(0, 0.0, 0,0)(1, 0.0, 0.0)(2, 0.02778, 0.02878)...

其中第一个条目是数组索引,第二个条目是第一个数组值,第三个条目是第二个数组值。

是否有一些 scala 函数来实现这一点(带地图的 zip 或类似的东西)?

谢谢, 机器学习

【问题讨论】:

  • `zipWithIndices' 是你的朋友。

标签: arrays scala


【解决方案1】:
val diceProbDist = Array(0.1, 0.2, 0.3)
val diceExpDist = Array(0.11, 0.22, 0.33)

diceProbDist
 .zip(diceExpDist)
 .zipWithIndex
 .map { case ((v1, v2), i) => (i, v1, v2) }

// result: Array((0,0.1,0.11), (1,0.2,0.22), (2,0.3,0.33))

【讨论】:

  • 漂亮!!我正在玩弄这些概念,但没有成功。
  • 给定的解决方案不能编译正常吗?
  • 嗯,没有注意到这个复制粘贴错误,感谢指正,已修复。
【解决方案2】:

如果您不介意,简单的for 理解也应该可以解决问题:

for {
  index <- 0 until math.min(diceExpDist.length, diceProbDist.length)
} yield (index, diceProbDist(index), diceExpDist(index))

【讨论】:

  • 这个也很酷。来自Java背景,我可以很容易地理解这一点。
【解决方案3】:

另一种解决方案,类似于 tkachuko 的解决方案,没有 for 理解

val diceProbDist = List(0.1, 0.2, 0.3)
val diceExpDist = List(0.11, 0.22, 0.33)

val range = 0 until math.min(diceExpDist.length, diceProbDist.length)
range.map { idx => (idx, c(idx), d(idx)) }

// result : res0: List[(Int, Int, Int)] = List((0,0,11), (1,1,12), (2,2,13), (3,3,14), (4,4,15), (5,5,16), (6,6,17), (7,7,18), (8,8,19), (9,9,20))

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    相关资源
    最近更新 更多