2011-05-09 11 views
3

辞書のセットkは、特定の評価のためにNumPy.arraysをループしたい形の{(i,j):NumPy.array}という形式です。{tuple:NumPy.array}のルーピング辞書

次のように私はdictionarriesを作った:

datarr = ['PowUse', 'PowHea', 'PowSol', 'Top'] 
for i in range(len(dat)): exec(datarr[i]+'={}') 

ので、私はいつも私は、文字列の元のリストをchangeingことで、コードの私の大きなセットに評価したいデータのセットを変更することができます。しかし、これは私の辞書をeval(k) for k in datarrと呼ぶ必要があることを意味します。

その結果、私がやりたいループは一瞬のために次のようになります。

for i in filarr: 
    for j in buiarr: 
     for l in datarrdif: 
      a = eval(l)[(i, j)] 
      a[abs(a)<.01] = float('NaN') 
      eval(l).update({(i, j):a}) 

が、これを書くために非常に良くする方法はありますか?私は、次の試してみましたが、これは動作しませんでした:事前に

[eval(l)[(i, j)][abs(eval(l)[(i, j)])<.01 for i in filarr for j in buiarr for k in datarrdiff] = float('NaN')` 

Thxを

答えて

4
datarr = ['PowUse', 'PowHea', 'PowSol', 'Top'] 
for i in range(len(dat)): exec(datarr[i]+'={}') 

は、なぜあなたは辞書の辞書としてそれらを作成していませんか?

datarr = ['PowUse', 'PowHea', 'PowSol', 'Top'] 
data = dict((name, {}) for name in datarr) 

eval()をすべて避けることができます。

for i in filarr: 
    for j in buiarr: 
     for l in datarr: 
      a = data[l][(i, j)] 
      np.putmask(a, np.abs(a)<.01, np.nan) 
      data[l].update({(i, j):a}) 

またはおそらく:

for arr in data.itervalues(): 
    np.putmask(arr, np.abs(arr)<.01, np.nan) 

あなたはNaNにabs(element) < .01すべての辞書の値のすべての要素を設定したい場合。

+0

@eurniro:すばらしい、これはまさに私が必要とするもので、辞書の辞書を作るという考え方だけでなく、np.putmask(...)の使用です! –