2017-03-03 105 views
0

我想转换此JSON响应:斯卡拉JSON到DenseMatrix

[ 
    { 
     "metric":"energy.salted", 
     "tags":{ 
     "sensor":"0", 
     "unit":"101" 
     }, 
     "aggregateTags":[ 

     ], 
     "dps":{ 
     "1477958400":1.9519165754318237, 
     "1477958401":-0.4030894637107849, 
     "1477958402":0.6892277598381042, 
     "1477958403":3.0232467651367188, 
     "1477958404":0.07003471255302429, 
     "1477958405":2.305912971496582 
     } 
    }, 
    { 
     "metric":"energy.salted", 
     "tags":{ 
     "sensor":"1", 
     "unit":"101" 
     }, 
     "aggregateTags":[ 

     ], 
     "dps":{ 
     "1477958400":4.979776382446289, 
     "1477958401":1.8036608695983887, 
     "1477958402":3.0569913387298584, 
     "1477958403":0.8318896889686584, 
     "1477958404":-0.3151852488517761, 
     "1477958405":2.563884735107422 
     } 
    } 
] 

与“DPS”键相关联的值的DenseMatrix。最后DenseMatrix应该是这样的:

[ 
    [1.9519165754318237, -0.4030894637107849, 0.6892277598381042, 3.0232467651367188, 0.07003471255302429, 2.305912971496582], 
    [4.979776382446289, 1.8036608695983887, 3.0569913387298584, 0.8318896889686584, -0.3151852488517761, 2.563884735107422] 
] 

我已经使用play.api.libs.json.JSON解析的JSON,我甚至可以用提取 “DPS” 值:

jsonResponse = Json.parse(response.body) 
for (i <- 0 until numSensors) { 
    dataMap = (jsonResponse.apply(i) \ "dps") 
} 

但是,如何将它转换为具有上述格式的密集矩阵?

回答

1

假设你有相同的密钥对所有DPS,你可以试试这个,创建一个空DenseMatrix每个数组绑定到矩阵DenseMatrix.vertcat

val keys = List("1477958400", "1477958401", "1477958402", "1477958403", "1477958404", "1477958405") 

var mat = new DenseMatrix[Double](0, 6, Array.empty[Double]) 

for (i <- 0 until numSensors) { 

    val dataMap = (jsonResponse.apply(i) \ "dps") 
    val array = keys.map(key => (dataMap \ key).as[Double]).toArray 

    mat = DenseMatrix.vertcat(mat, new DenseMatrix[Double](1, 6, array)) 
} 

mat 

//breeze.linalg.DenseMatrix[Double] = 1.9519165754318237 -0.4030894637107849 0.6892277598381042 ... (6 total) 
//         4.979776382446289 1.8036608695983887 3.0569913387298584 ... 
+0

这帮助了很多队友谢谢!无论如何,horzcat可以做同样的事情吗?我尝试将mat初始化为'var mat = new DenseMatrix [Double](6,0,Array.empty [Double])',并使用'mat = DenseMatrix.horzcat(mat,new DenseMatrix [Double](6,1,array ))''但编译器告诉我有6行0列是不可能的lol – Chirag

+0

更具体地说,编译器说'java.lang.IndexOutOfBoundsException:MajorStride == 1小于行== 5,这是不可能的我正在执行'horizcat'的行。我可能错误地解释了这一点。 – Chirag

+1

这看起来像[问题](https://github.com/scalanlp/breeze/issues/488)。顺便说一句,你总是可以做'vertcat',然后用'mat.t'转置矩阵。虽然不理想。 – Psidom