Clojure中的科学数据集操作 - 将ByteBffers读入矩阵

Sam*_*hie 10 numpy clojure matrix incanter

我希望使用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)))
Run Code Online (Sandbox Code Playgroud)

现在,我真的在努力学习如何将它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,:,:];
Run Code Online (Sandbox Code Playgroud)

在此切片之后,我想返回这12个数组的向量.(我需要将它们分别作为未来的功能输入进行操作.)

因此,非常感谢有关如何将此数据集导入Incanter的任何建议.

bde*_*ham 6

我不知道如何将你ByteBuffer转换为数组,但这里是reshape函数的一个实现:

(defn reshape [v c]
  (if (= (count v) 1)
    c
    (recur (butlast v)
           (partition (last v) c))))
Run Code Online (Sandbox Code Playgroud)

(这在我的有限测试中工作正常.)如果您的数据在矢量中,r那么您可以实现

rain_data = rain_data.reshape(24, 360, 720);
Run Code Online (Sandbox Code Playgroud)

(reshape '(24 360 720) r)
Run Code Online (Sandbox Code Playgroud)