我有这样的地图
var kk:scala.collection.mutable.Map[Int,Array[Int]] = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))
我需要的是按位置总结值数组,如numpy数组添加,结果应该像这个数组(1 + 2 + 4,3 + 8 + 5)
答案 0 :(得分:3)
使用.values
获取数组的List
或.transpose
在每个“列”上应用.map
时更短一点:
scala> val data = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))
data: scala.collection.immutable.Map[Int,Array[Int]] = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))
scala> data.values.transpose.map(_.sum)
res4: Iterable[Int] = List(7, 16)
如果您想获得.toArray
Array
scala> data.values.transpose.map(_.sum).toArray
res5: Array[Int] = Array(7, 16)
答案 1 :(得分:0)
您需要在地图上iterate
获取地图值的第一个和第二个元素的单独列表。然后应用fold
函数。
scala> val data = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))
data: scala.collection.mutable.Map[Int,Array[Int]] = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5))
scala> data.map(kv => kv._2.head -> kv._2.last).foldLeft(0, 0)((a, b) => (a._1 + b._1) -> (a._2 + b._2))
res11: (Int, Int) = (7,16)
如果您希望结果在上述结果中明确Array
做.productIterator.toArray
。
scala> data.map(kv => kv._2.head -> kv._2.last).foldLeft(0, 0)((a, b) => (a._1 + b._1) -> (a._2 + b._2)).productIterator.toArray
res13: Array[Any] = Array(7, 16)