2017-11-06 2 views
-1

私は、約50個の変数を持つdict(dsst_mean)を返すループ内で呼び出される関数を持っています。すべての変数は長さ10の配列がnumpyです。Python:numpy配列の多くのdictを同じキーとサイズで連結する

ループは約3000回繰り返します。私は現在、各ループの終わりに向かって連結しているので、各反復で大きくなる「dsst_mean_all」辞書があります。

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' dictの初期化に問題があります。 (私は現在dict.fromkeys()を使ってこれを行っています)。

私の質問はこれをより効率的に行うためのオプションは何ですか?私はリストにdsst_mean dictsを格納し、最後に1つを連結することができると思っています。しかし、私は3000 +メモリのnumpyアレイのdictsを保持することは良い考えであるかどうかは分かりません。私はこれがサイズに依存していることを知っていますが、残念ながら今はそれぞれの 'dsst_mean' dictのサイズを見積もっていません。

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

+0

効率的ではないだけでなく、反復している辞書を変更するのは非常に危険です。あなたのプログラムは、キーをスキップしたり、キーを2回反復したり、無限ループに陥ることさえあります。 –

+2

建設的な提案はありますか? – InitialConditions

+0

メモリの問題であることがわかるまで、それらをリストとして保存しても問題ありません。それはメモリの面で多くのオーバヘッドを加えるべきではなく、各反復ごとに配列を作成するよりはるかに効率的です。 – user2699

答えて

0

通常、値をリストで収集し、最後に配列を1回作成することをお勧めします。ここでの新しいことは、このコレクションを行うために辞書のキーを反復する必要があることです。例えば

In [804]: def foo(i): 
    ...:  return {k:np.arange(5) for k in ['A','B','C']} 
    ...: 
In [805]: foo(0) 
Out[805]: 
{'A': array([0, 1, 2, 3, 4]), 
'B': array([0, 1, 2, 3, 4]), 
'C': array([0, 1, 2, 3, 4])} 

コレクタ辞書:

In [806]: dd = {k:[] for k in ['A','B','C']} 

反復、リスト内の配列を収集:

In [807]: for _ in range(3): 
    ...:  x = foo(None) 
    ...:  for k,v in dd.items(): 
    ...:   v.append(x[k]) 
    ...:   
In [808]: dd 
Out[808]: 
{'A': [array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4])], 
'B': [array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4])], 
'C': [array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4])]} 
個人辞書を作成する

機能

配列のいくつかの並べ替え(stackconcatenate、あなたの選択)にリストを有効にする辞書上の別の反復:

In [810]: for k,v in dd.items(): 
    ...:  dd[k]=np.stack(v,axis=0) 
    ...:  
In [811]: dd 
Out[811]: 
{'A': array([[0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4]]), 'B': array([[0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4]]), 'C': array([[0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4]])} 

は、長さ10の3000のアレイのリストは30,000 1つの配列よりも多少多くのメモリを占有します数字は大きくなりませんが、それ以上はありません。

辞書を1つのリストにまとめて収集することはできますが、そのような辞書にそれらを組み合わせる必要があります。

関連する問題