【问题标题】:looping dictionaries of {tuple:NumPy.array}{tuple:NumPy.array} 的循环字典
【发布时间】:2011-08-21 12:09:38
【问题描述】:

我有一组 k 格式为 {(i,j):NumPy.array} 的字典,我想在其中循环 NumPy.arrays 以进行特定评估。

我制作的字典如下:

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

所以我总是可以通过更改原始字符串列表来更改我想要在更大的代码集中评估的数据集。但是,这意味着我必须将我的字典调用为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')`

提前谢谢

【问题讨论】:

    标签: python dictionary for-loop numpy eval


    【解决方案1】:
    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)
    

    如果要将所有字典值的所有元素设置为 abs(element) &lt; .01 为 NaN 。

    【讨论】:

    • @eurniro:太棒了,这确实是我所需要的,既是制作字典的想法,也是使用 np.putmask(...) !
    猜你喜欢
    • 2022-11-17
    • 2020-02-10
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2021-05-30
    • 2017-07-22
    相关资源
    最近更新 更多