Обработка научных наборов данных в Clojure - чтение байтовых буферов в матрицы

Я собираюсь использовать Clojure и Incanter для обработки большого набора научных данных; в частности, версия этого набора данных на 0,5 градуса (доступна только в двоичном формате).

Мой вопрос: какие у вас есть рекомендации по элегантным способам решения этой проблемы в Java / Clojure? Есть ли простой способ передать этот набор данных в Incanter или какой-нибудь другой пакет java-матрицы?

Мне удалось прочитать двоичные данные в java.nio.ByteBuffer , используя следующий код:

(defn to-float-array [^String str]
  (-> (io/to-byte-array (io/to-file str))
      java.nio.ByteBuffer/wrap
      (.order java.nio.ByteOrder/LITTLE_ENDIAN)))

Теперь я действительно борюсь с тем, как начать управлять этим ByteBuffer как массивом. Я использовал Python NumPy, который позволяет очень легко манипулировать этими огромными наборами данных. Вот код Python для того, что я хочу сделать:

// reshape row vector into (time, lat_slices, lon_slices)
// then cut out every other row
rain_data = np.fromfile("path/to/file", dtype="f")
rain_data = rain_data.reshape(24, 360, 720);
rain_data = rain_data[0:23:2,:,:];

После этого нарезания Я хочу вернуть вектор из этих двенадцати массивов. (Мне нужно управлять каждым из них по отдельности в качестве входных данных будущих функций.)

Поэтому я буду очень признателен за любые советы о том, как получить этот набор данных в Incanter.

10
задан Sam Ritchie 1 February 2011 в 17:46
поделиться