2017-10-23 6 views
-1

私はループ内でpython dictsを連結します(図示せず)。上記のコードの第2部分に見ることができるように、私は内で取得された辞書を連結し、numpy配列のdictを連結するnumpy dtypeを維持する

if station_index == 0: 
    dsst_mean_all = {} 
    for key in dsst_mean:       
     dsst_mean_all[key] = []    

source = [dsst_mean_all, dsst_mean]     
    for key in source[0]: 
     dsst_mean_all[key] = np.concatenate([d[key] for d in source]) 

、その後私は、ループの最初のインスタンスに新しい空の辞書(dsst_mean_all)を宣言しますループ(dsst_mean)をすべてのデータ(dsst_mean_all)を保持する大きなdictと置き換えます。

ここで、dsst_meanは要素が異なる型のnumpy配列であるdictです。主にfloat32です。私の質問は、どのように連結中にデータ型を保持できますか?私のdsst_mean_all dictはすべての要素に対してfloat64 numpyの配列になります。メモリを節約しファイルサイズを減らすために、dsst_meanと一致させるためにこれらが必要です。ループのすべての反復のdsst_meanは、同じdtypeの同じ構造と要素を持つことに注意してください。

ありがとうございました。

+0

あなたの説明は、辞書、リストと配列をアップミックスします。 'source'配列またはリストに値がありますか? – hpaulj

+0

ソースはdsst_mean_allとdsst_meanの2つのdictのリストです。 – InitialConditions

+0

通常、リスト内のすべてのコンポーネント配列を収集し、最後に1回連結することをお勧めします。これは通常、繰り返し連結されたものより速く、初期化が容易です。 – hpaulj

答えて

1

配列のdtypeをリスト内包表記で定義できます。

どちらかがhardecoded:

dsst_mean_all[key] = np.concatenate([d[key].astype('float32') for d in source]) 

または動的:

dsst_mean_all[key] = np.concatenate([d[key].astype(d[key].dtype) for d in source]) 

ドキュメント:https://docs.scipy.org/doc/numpy-1.13.0/user/basics.types.html

0

これを解決する1つの方法は、dsst_mean_allを新しい空のdictとして宣言しないようにすることです。これは私が思うように、すべてがデフォルトでfloat64にキャストされている理由です。 if/elseステートメントでは、最初の反復でdsst_mean_allをdsst_meanに設定します。その後のすべての反復では、元の質問に示すように連結を行います。

関連する問題