10

大規模な科学データセットの処理に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,:,:];

このスライスの後、これらの12個の配列のベクトルを返したいと思います。(将来の関数入力として、それぞれを個別に操作する必要があります。)

したがって、このデータセットをIncanterに取り込む方法についてのアドバイスをいただければ幸いです。

4

1 に答える 1

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)
于 2011-02-01T21:12:00.833 に答える