2016-05-20 8 views
0

私は、numpy配列をテキストファイルまたは圧縮イメージファイルにエクスポートするための純粋なpythonの方法を探しています。私の配列は500x700ですので、それをエクスポートすると〜3MBのサイズのファイルが生成されます。私はそれが少なくとも1MB未満である必要があります。純粋なpythonの方法は、テキストや画像ファイルにnumpy配列を圧縮するには?

私はtifffileパッケージを試しましたが、圧縮モードは1から9までしかないので、十分ではありません。

私のファイルは、「マトリックス」形式、X Y Z形式、TIFF形式、または圧縮時にデータを失わず、GISソフトウェアと互換性のある他の形式の形式にすることができます。

私はまた、可能ならば、それは遠いmachine.¸

上の任意のアイデアを実行するときに互換性の問題を回避するために、純粋なPythonでと(サブプロセスを呼び出すような)外部要件なしにする必要がありますか?

+2

どのような数字ですか?その範囲は何ですか?彼らはどのような正確さを再構築する必要がありますか?数字には相関関係はありますか?すなわち、マトリックスの近くの数字は、お互いから遠い数字よりも互いに近い値であるか?数字が効果的にランダムに見える場合、標準のロスレス圧縮器を使用するとほとんど圧縮されません。 3倍にするには、冗長性と相関性のためにデータを圧縮可能にする必要があります。そのためには、そのデータを活用する必要があります。 –

+0

私の配列は、クリギング補間から生成されたグリッドです。範囲は可変ですが、75から2500のようにすることができます。 – kaycee

+0

次に、補間している値だけを送信/保存しないのはなぜですか?補間は受信機に任せてください。それはかなりそこにそれを圧縮するかもしれないように聞こえる。 –

答えて

0

は、圧縮.npz形式で単一のファイルにnp.savez_compressed numpy.savez_compressed

(ファイル、* argsを、** kwds)

保存複数のアレイを見てください。

Example

from tempfile import TemporaryFile 
outfile = TemporaryFile() 
x = np.arange(10) 
y = np.sin(x) 
np.savez_compressed(outfile, x, y) 
outfile.seek(0) # Only needed here to simulate closing & reopening file 
npzfile = np.load(outfile) 
npzfile.files 

npzfile['arr_0'] 
+0

.npz形式はGISソフトウェアにはあまり適していません... – kaycee

+0

理由を説明できますか?それはzlib圧縮を持つコンテナのほんの一部ですね。 – renemilk

1

あなたはGISソフトウェアのためにそれを必要とする場合は、GDALまたはrasterioのいずれかを使用します。たとえば、GTiff driverを使用してGeoTiffを作成します。ここで、あなたはフロートを持っていると仮定すると

はGDALです:

import numpy as np 
from osgeo import gdal 
gdal.UseExceptions() 
driver = gdal.GetDriverByName('GTiff') 
ds = driver.Create('file.tif', 500, 700, 1, gdal.GDT_Float32, ['COMPRESS=LZW']) 
ly = ds.GetRasterBand(1) 
ly.WriteArray(np.arange(500 * 700).reshape(700, 500)) 
ly = ds = None # save, close 

またはrasterio:

import rasterio 
with rasterio.open('file2.tif', 'w', 'GTiff', width=500, height=700, count=1, dtype='f', COMPRESS='LZW'): 
    ds.write(np.arange(500 * 700, dtype='f').reshape(1, 700, 500)) 

これらのファイルは< 1メガバイトです。 Byte型またはInt16型を使用すると、サイズが小さくなります。

(注:投影または地理参照は追加されません)