多次元配列データをテキストファイルに書き込んでいます。私はこの行を賢くやっています。ファイルのサイズは大きくなり続けます。出力ファイルのサイズを可能な限り小さくするには、どのような手法に従う必要がありますか?
2 に答える
配列に多くのゼロがある場合は、スパース行列表現を使用できます。行列全体をファイルに書き込む代わりに、ゼロ以外の要素のみを書き込みます(もちろん、各要素にそのインデックスを1つずつ書き込む必要があります)。この行列を書きたいとしましょう:
0 0 0 2
1 0 0 0
0 0 0 0
0 0 3 0
0 0 0 0
これをファイルに書き込むことができます:
0 3 2
1 0 1
3 2 3
各行で、最初の数値は行、2番目は列、3番目は格納された値です。
ファイルをテキストとして書き込んでいる場合は、バイナリ形式に切り替えることができます。テキストを書き込むときは、各桁に1バイトを使用します。バイナリでは、数値ごとに固定量のバイトを使用し、スペースや改行を表す必要はありません。
100 200 300
テキスト形式を使用する場合、ファイルへの数値の書き込みには11バイトかかります。ただし、16ビット整数を3つ書き込む場合は、6バイトを使用して書き込むことができます。Pythonでは、バイナリファイルを開くために「wb」モードと「rb」モードを使用してから、それらをバイトとして書き込みます。
f = open('file', 'wb')
f.write('%c' % 123)
f.close()
または-より効率的に、
import array
f = open('file', 'wb')
data = array.array('B')
data.append(1)
data.append(2)
data.append(3)
data.tofile(f)
f.close()
それ以外の場合は、標準的な手法を使用して、データ構造を圧縮してみてください。質問にをタグ付けしたので、データ圧縮用python
のこれらのPythonライブラリにおそらく興味があるでしょう。
データ圧縮についてもっと知りたい場合に備えて、理論的には少し重いデータ圧縮のこの素晴らしい紹介もあります。
データは非常にまばらなので、SciPyPackages/Sparseを使用できます。I /Oについてはこれを見ることができます
スパース行列は、多数のゼロ値を持つ単純な行列です。
だから、自分でコードを書きたいのなら。保存するときはsparse matrix
、ゼロ以外の要素の位置と要素値を出力するだけで済みます。例えば:
sparse matrix
:_
1 0 0 1
0 0 0 0
0 0 5 0
0 0 0 10
ファイルに保存する必要のあるデータは次のとおりです。
0 0 1
0 3 1
2 2 5
3 3 10
栽培者の場合sparse matrix
、このメソッドはデータを減らしてに保存することができますfile
。
そして、いつ使用するかは、データからdata file
回復するだけです。original matrix
幸運を