2017-10-12 5 views
0

によって合計アップマップの値を、私は私が必要なものこのスカラ - 位置

var kk:scala.collection.mutable.Map[Int,Array[Int]] = Map(2 -> Array(1, 3), 1 -> Array(2, 8), 3 -> Array(4, 5)) 

のようなマップを持っているがnumpyの配列は追加など、位置によって合計最大値の配列で、その結果がこのArrayようにする必要があります(1 + 2 + 4、3 + 8 + 5)

答えて

3

それとも少し短く、各「列」に.mapを適用するには、単なる配列のListを取得するために.valuesを使用して、そして.transpose

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) 
+0

@chunjefはフォーマットに感謝しています:) – Ossip

0

マップ上ではiterateにマップ値の1番目と2番目の要素の別のリストを取得する必要があります。次に、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)