2017-10-12 1 views
0

Ich habe eine Karte wie diesescala - Summe auf Karte Wert von Position

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

Was ich brauche Summe up Wert Arrays von Position ist, wie numpy Array hinzugefügt, und das Ergebnis sollte wie dieser Array sein (1 + 2 + 4, 3 + 8 + 5)

Antwort

3

Oder etwas kürzer mit .values um nur List des Arrays zu erhalten, und .transpose.map auf jeder „Spalte“ anwenden:

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) 

Und .toArray hinzufügen, wenn Sie möchten, erhalten ein Array:

scala> data.values.transpose.map(_.sum).toArray 
res5: Array[Int] = Array(7, 16) 
+0

@chunjef danke für die Formatierung :) – Ossip

0

Sie müssen iterate über die Karte, um die separate Liste der ersten und zweiten Elemente Ihrer Kartenwerte zu erhalten. Wenden Sie dann die Funktion fold an.

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) 

, wenn Sie das Ergebnis wollen ein Array tun .productIterator.toArray auf obiges Ergebnis explizit sein.

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)