【データ分析】【Python】多次元データの効率的な操作、読み取りと格納-numpy、h 5 py実現

12185 ワード

多次元データストレージと多次元データ操作は、データ分析と機械学習の科学研究の仕事の中で最もよく出会う問題である.よく見られる多次元データには、真彩図、リモートセンシング映像図、医学映像図、最近比較的火の深さ図などがある.
多次元データの特徴:
  • のデータ量は大きく、単一のデータも少なくとも(10000000,10)このレベルです.
  • マトリックス形式
  • ストレージでは、次のようなさまざまな点を考慮する必要があります.
  • は、データを圧縮します.一般的なテキスト形式で保存すると、単一のデータが動かないと10以上のGになり、
  • は絶対にだめです.
  • が格納された後、スライスして読み取ることができる.そうでなければ、データの中の小さなブロックのデータを読み取るには、すべてのデータをメモリに読み込んで検索する必要があります.これもだめです.
  • ストレージフォーマットは共通です.そうでなければ、業務の上流でデータが作成され、業務の下流で使用される場合、大きな障害があります.
  • データは、ツールによって可視化されて表示されます.
  • ライブラリのインストールが便利です.すぐに科学研究者にHadoop、Sparkを遊ばせないでください...

  • 最適なソリューション
    上記の問題に対して、最適な解決策はHDF 5形式で保存することである.対応するPythonライブラリはh 5 pyです.HDF 5公式アドレス:https://www.hdfgroup.org/solutions/hdf5/h 5 py公式アドレス:https://www.h5py.org/
    HDF 5の利点
  • Pythonライブラリのインストールが便利です.Anacondaに統合されています.Anacondaをインストールすると、h 5 pyというライブラリが
  • あります.
  • フォーマットは共通です.Pytorchで推奨される多次元データ保存フォーマットでもあり、h 5 pyで読み取るデータはnumpy.ndarrayクラス
  • が可視化されます.公式サイトでHDF 5のHDFViewerソフトウェアをダウンロードし、直接ファイルを開いて表示することができます.
  • データ圧縮.経験によると、TXT形式に保存するには2 G空間のデータが必要であり、HDF 5を使用すると数十MBしか必要とせず、数十倍の空間
  • を節約した.
  • スライス読み込み.メモリにデータを全て読み出す検索を行う必要はなく、スライス操作で直接読み取ることができ、他の不要なデータはメモリ
  • に読み込まれない.
    HDF 5の一般的な操作、Pythonに基づくh 5 pyとnumpy
    データせつぞく
    まず2番目の質問に答えて、多次元データをどのようにつなぐか.
    import numpy as np
    
    #   (3, 1, 2)     
    shape1 = (3, 1, 2)
    a = np.zeros(shape1, dtype=np.int)
    print(a.shape)  # (3, 1, 2)
    
    #   (4, 1, 2)     
    shape2 = (4, 1, 2)
    b = np.ones(shape2, dtype=np.int)
    print(b.shape)  # (4, 1, 2)
    
    #          a c
    axis = 0  # axis                ,  numpy 0-base,          0
    c = np.concatenate((a, b), axis=axis)
    print(c.shape)  # (7, 1, 2)
    

    HDF 5形式で保存
    import h5py
    with h5py.File("c.hdf5", 'w') as f:  #       ‘w’
        f.create_dataset("a_data", data=a, compression="gzip", compression_opts=5)
        f.create_dataset("b_data", data=b, compression="gzip", compression_opts=5)
        f.create_dataset("c_data", data=c, compression="gzip", compression_opts=5)
    # c_data: HDF5   c       
    # compression="gzip":        ,       gzip
    # compression_opts=5:     ,      ,     ,       CPU     
    

    HDF 5形式ファイルのデータを読み込む
    with h5py.File("c.hdf5", 'r') as f:  #       ‘r’
        print(f.keys())
        a_new = f.get("a_data")[:]
        b_new = f.get("b_data")[:]
        c_new = f.get("c_data")[:]
    

    書き込みデータと読み込んだデータが同じかどうかを確認します
    print(a == a_new)
    print(b == b_new)
    print(c == c_new)
    

    比較して1つの(5000000 5000)のデータを保存して、どれだけの空間を節約して、データINT
    import os
    import numpy as np
    data_5000_5000 = np.arange(0, 5000*5000, dtype=np.int).reshape(5000, 5000)
    print(data_5000_5000)
    

    [[ 0 1 2 … 4997 4998 4999] [ 5000 5001 5002 … 9997 9998 9999] [ 10000 10001 10002 … 14997 14998 14999] … [24985000 24985001 24985002 … 24989997 24989998 24989999] [24990000 24990001 24990002 … 24994997 24994998 24994999] [24995000 24995001 24995002 … 24999997 24999998 24999999]]
    TXTの使用
    np.savetxt("data.txt", data_5000_5000)
    print(os.path.getsize("data.txt") / 1024 / 1024)
    

    596.0512161254883 MB
    HDF 5の使用
    with h5py.File("data.hdf5", 'w') as f:
        f.create_dataset("data", data=data_5000_5000, compression="gzip", compression_opts=5)
    

    33.43095302581787 MB
    結論
    TXT形式の保存は596.05 MB、HDF 5形式の保存は33.43 MBであることがわかる.
    596.05 / 33.43
    

    17.829793598564162約17倍のスペースを節約