我希望使用Clojure和Incanter处理大型科学数据集;具体来说,this dataset的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,:,:];
在此切片之后,我想返回这12个数组的向量。 (我需要将它们分别作为未来的功能输入进行操作。)
因此,非常感谢有关如何将此数据集导入Incanter的任何建议。
答案 0 :(得分:6)
我不知道如何将ByteBuffer
转换为数组,但这是reshape
函数的实现:
(defn reshape [v c]
(if (= (count v) 1)
c
(recur (butlast v)
(partition (last v) c))))
(这在我的有限测试中效果很好。)如果您的数据位于向量r
中,那么您可以实现
rain_data = rain_data.reshape(24, 360, 720);
作为
(reshape '(24 360 720) r)