Scala JSON в DenseMatrix

Я пытаюсь преобразовать этот ответ JSON:

[
   {  
      "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
      }
   }
]

В DenseMatrix значений, связанных с ключами "dps". Окончательная 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]
]

Я проанализировал JSON, используя play.api.libs.json.JSON, и я даже могу извлечь значения «dps», используя:

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

Но как мне преобразовать его в плотную матрицу с указанным выше форматом?


person Chirag    schedule 03.03.2017    source источник


Ответы (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  ...
person Psidom    schedule 03.03.2017
comment
Это очень помогло дружище спасибо! Можно ли сделать то же самое с horzcat? Я попытался инициализировать мат как var mat = new DenseMatrix[Double](6, 0, Array.empty[Double]) и использовать mat = DenseMatrix.horzcat(mat, new DenseMatrix[Double](6, 1, array)), но компилятор говорит мне, что иметь 6 строк и 0 столбцов невозможно, лол. - person Chirag; 06.03.2017
comment
Точнее говоря, компилятор говорит java.lang.IndexOutOfBoundsException: MajorStride == 1 is smaller than rows == 5, which is impossible в строке, где я выполняю horizcat. Я, возможно, неправильно интерпретировал это. - person Chirag; 06.03.2017
comment
Это похоже на проблему. Кстати, вы всегда можете сделать vertcat, а затем транспонировать матрицу с помощью mat.t. Хотя и не идеально. - person Psidom; 06.03.2017