16

ここで最初の質問。簡潔にしようと思います。

機械学習アプリケーションの機能情報を含む複数の配列を生成しています。配列の次元が同じではないため、配列ではなく辞書に格納します。2 種類の機能があるため、2 つの異なる辞書を使用しています。

また、機能に合わせてラベルを生成します。これらのラベルは配列に格納されます。さらに、スクリプトの実行に使用される正確なパラメーターとタイムスタンプを含む文字列があります。

全体として、次のようになります。

import numpy as np    

feature1 = {}
feature2 = {}
label1 = np.array([])
label2 = np.array([])
docString = 'Commands passed to the script were...'

# features look like this:
feature1 = {'case 1': np.array([1, 2, 3, ...]),
            'case 2': np.array([2, 1, 3, ...]),
            'case 3': np.array([2, 3, 1, ...]),
            and so on... }

今、私の目標はこれを行うことです:

np.savez(outputFile, 
         saveFeature1 = feature1, 
         saveFeature2 = feature2, 
         saveLabel1 = label1, 
         saveLabel2 = label2,
         saveString = docString)

これは機能しているように見えます (つまり、このようなファイルはエラーがスローされることなく保存され、再度ロードできます)。ただし、たとえばファイルから機能を再度読み込もうとすると、次のようになります。

loadedArchive = np.load(outFile)
loadedFeature1 = loadedArchive['saveFeature1']
loadedString = loadedArchive['saveString']

次に、辞書を取得する代わりに、内容にアクセスする方法がわからない形状 (0) の numpy 配列を取得します。

In []: loadedFeature1
Out[]: 
       array({'case 1': array([1, 2, 3, ...]), 
              'case 2': array([2, 3, 1, ...]), 
              ..., }, dtype=object)

また、文字列は配列になり、奇妙なデータ型を取得します。

In []: loadedString.dtype
Out[]: dtype('|S20')

要するに、これは正しく行われていないと思います。ただし、すべての変数を 1 つの大きな辞書に入れないようにしたいと思います。別のプロセスでそれらを取得し、文字列の比較を気にせずに Dictionary.keys() をループしたいからです。

どんなアイデアでも大歓迎です。ありがとう

4

3 に答える 3

17

@fraxel がすでに示唆しているように、この場合は pickle を使用する方がはるかに優れたオプションです。dictアイテムを入れて保存するだけです。

ただし、必ずバイナリ プロトコルで pickle を使用してください。デフォルトでは、効率の低い形式であり、配列が大きい場合、メモリが過剰に使用され、ファイルが巨大になります。

saved_data = dict(outputFile, 
                  saveFeature1 = feature1, 
                  saveFeature2 = feature2, 
                  saveLabel1 = label1, 
                  saveLabel2 = label2,
                  saveString = docString)

with open('test.dat', 'wb') as outfile:
    pickle.dump(saved_data, outfile, protocol=pickle.HIGHEST_PROTOCOL)

そうは言っても、説明のために何が起こっているのかを詳しく見てみましょう。

numpy.savez各アイテムが配列であることを期待します。実際、それはnp.asarrayあなたが渡すすべてのものを呼び出します。

adictを配列にすると、オブジェクト配列が得られます。例えば

import numpy as np

test = {'a':np.arange(10), 'b':np.arange(20)}
testarr = np.asarray(test)

同様に、文字列から配列を作成すると、文字列配列が得られます。

In [1]: np.asarray('abc')
Out[1]: 
array('abc', 
      dtype='|S3')

ただし、オブジェクト配列の処理方法に癖があるため、タプル、リスト、または配列ではない単一のオブジェクト (この場合はあなたのdict) を渡すと、0 次元のオブジェクト配列が得られます。 .

これは、直接インデックスを作成できないことを意味します。実際、実行testarr[0]すると が発生しIndexErrorます。データはまだそこにありますが、最初にディメンションを追加する必要があるため、yourdictionary = testarr.reshape(-1)[0].

これらすべてが不格好に見える場合、それはそれが原因です。オブジェクト配列は本質的に常に間違った答えです。(asarray間違いなく に渡す必要がありますndmin=1array、これはこの特定の問題を解決しますが、他のものを壊す可能性があります。)

savez任意のオブジェクトではなく、配列を格納することを目的としています。その動作方法により、完全に任意のオブジェクトを格納できますが、そのように使用しないでください。

ただし、それを使用したい場合、簡単な回避策は次のとおりです。

np.savez(outputFile, 
         saveFeature1 = [feature1], 
         saveFeature2 = [feature2], 
         saveLabel1 = [label1], 
         saveLabel2 = [label2],
         saveString = docString)

そして、あなたは物事にアクセスします

loadedArchive = np.load(outFile)
loadedFeature1 = loadedArchive['saveFeature1'][0]
loadedString = str(loadedArchive['saveString'])

ただし、これは単に pickle を使用するよりも明らかに扱いにくいものです。配列を保存するだけの場合に使用numpy.savezします。この場合、配列ではなく、ネストされたデータ構造を保存しています。

于 2012-04-09T16:28:23.090 に答える
11

構造化された方法でデータを保存する必要がある場合は、HDF5 ファイル形式 ( http://www.hdfgroup.org/HDF5/ ) の使用を検討する必要があります。非常に柔軟で、使いやすく、効率的で、他のソフトウェアが既にサポートしている可能性があります (HDFView、Mathematica、Matlab、Origin..)。h5pyと呼ばれる単純な python バインディングがあります。

データセットを構造のようなファイルシステムに保存し、辞書のように各データセットの属性を定義できます。例えば:

import numpy as np
import h5py

# some data
table1 = np.array([(1,1), (2,2), (3,3)], dtype=[('x', float), ('y', float)])
table2 = np.ones(shape=(3,3))

# save to data to file
h5file = h5py.File("test.h5", "w")
h5file.create_dataset("Table1", data=table1)
h5file.create_dataset("Table2", data=table2, compression=True)
# add attributes
h5file["Table2"].attrs["attribute1"] = "some info"
h5file["Table2"].attrs["attribute2"] = 42
h5file.close()

データの読み取りも簡単です。必要に応じて、大きなファイルからいくつかの要素だけを読み込むこともできます。

h5file = h5py.File("test.h5", "r")
# read from file (numpy-like behavior)
print h5file["Table1"]["x"][:2]
# read everything into memory (real numpy array)
print np.array(h5file["Table2"])
# read attributes
print h5file["Table2"].attrs["attribute1"]

より多くの機能と可能性については、ドキュメントと Web サイト (クイック スタート ガイドが参考になるかもしれません) に記載されています。

于 2012-04-09T18:50:26.093 に答える
0

すべての変数をオブジェクトに入れてから、Pickleを使用します。状態情報を保存するためのより良い方法です。

于 2012-04-09T15:55:03.783 に答える