2016-10-12 112 views
2

我有一個MLLIB分佈行矩陣,其中行順序無關緊要。有什麼方法可以輕鬆將其轉換爲微風密集的矩陣?我想可以逐行映射,但我對微風整體相對不熟悉。將行矩陣轉換爲Breeze密集矩陣

編輯:使用X.rows.map(x => x.toArray),我設法將它轉換成形式爲org.apache.spark.rdd.RDD [Array [Double]]的RDD。我相信這是正確的方向邁出的一步......

+0

您是否嘗試過對RDD進行「收集」,然後將其轉換爲微風矩陣? – ar7

+0

嗯,使用RDD上的collect,我最終得到:'breeze.linalg.DenseMatrix [Array [Double]]'。我需要的是'breeze.linalg.DenseMatrix [Double]'。不過謝謝你的建議。我相信我只需要將數組轉換爲矢量。 – mongolol

回答

6

在您的RDD上進行收集。它會返回給你一個Array[Array[Double]]

val array = your_rdd.collect()

一到數組的數組轉換成矩陣將做到以下幾點:答案

val dm = DenseMatrix(array.map(_.toArray):_*)

部分從here拍攝。希望這能解決問題。

+0

更改我的答案,因爲它更簡潔。謝謝。 – mongolol

+2

如果類型已經是'Array [Array [Double]]',則不需要轉換爲數組,只需使用'DenseMatrix(array:_ *)' –

2

最終獲得它下面的代碼工作。

import breeze.linalg.{DenseVector => BDV, DenseMatrix => BDM, sum} 
val arr = X.rows.map(x => x.toArray).collect.flatten 
val dm = new BDM(X.numRows().toInt, X.numCols().toInt, arr) 

感謝@ @ ar7幫助。