地圖的值我有這樣階 - 總結通過
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)
地圖的值我有這樣階 - 總結通過
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)
還是有點用.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)
您需要通過地圖0才能獲取地圖值的第一個和第二個元素的單獨列表。然後應用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)
@chunjef感謝格式:) – Ossip