使用Numpy非零指数高效执行嵌套字典查找和列表追加

时间:2018-02-01 22:02:50

标签: python-3.x numpy dictionary

我有工作代码来执行嵌套字典查找,并使用numpy的非零查找函数的结果将另一个查找的结果附加到每个键的列表中。基本上,我需要一个附加到字典的字符串列表。这些字符串和字典的键在一个点处被整数散列为整数,并使用单独的字典跟踪整数散列作为键,字符串作为值。我需要查找这些散列值并将字符串结果存储在字典中。令人困惑,所以希望看代码有所帮助。这是代码的简化版本:

for key in ResultDictionary:
        ResultDictionary[key] = []

true_indices = np.nonzero(numpy_array_of_booleans)
for idx in range(0, len(true_indices[0])):
    ResultDictionary.get(HashDictA.get(true_indices[0][idx])).append(HashDictB.get(true_indices[1][idx]))

此代码适用于我,但我希望有一种提高效率的方法。我不确定我是否因为嵌套查找而受到限制。速度还取决于非零函数返回的真实结果的数量。有什么想法吗?感谢任何建议。

2 个答案:

答案 0 :(得分:0)

您无法对字典查找做很多事情 - 您必须一次完成这些操作。

您可以稍微清理数组索引:

idxes = np.argwhere(numpy_array_of_booleans)
for i,j in idxes:
    ResultDictionary.get(HashDictA.get(i)).append(HashDictB.get(j)

argwheretranspose(nonzero(...)),将数组的元组转换为(n,2)索引对数组。我不认为这会对速度产生影响,但代码更清晰。

答案 1 :(得分:0)

以下是两条建议:

1)因为你的哈希值是用int来键入的,所以如果这是一个选项,它可能有助于将它们转换为数组甚至列表以便更快地查找。

k, v = map(list, (HashDictB.keys(), HashDictB.values())
mxk, mxv = max(k), max(v, key=len)
lookupB = np.empty((mxk+1,), dtype=f'U{mxv}')
lookupB[k] = v

2)您可以通过处理ResultDictionary行来保存HashDictAnumpy_array_of_booleans中的大量查询:

i, j = np.where(numpy_array_of_indices)
bnds, = np.where(np.r_[True, i[:-1] != i[1:], True])
ResultDict = {HashDictA[i[l]]: [HashDictB[jj] for jj in j[l:r]] for l, r in zip(bnds[:-1], bnds[1:])}

2b)如果由于某种原因你需要逐步添加关联,你可以做一些事情(我会缩短变量名称)

from operator import itemgetter
res = {}

def add_batch(data, res, hA, hB):
    i, j = np.where(data)
    bnds, = np.where(np.r_[True, i[:-1] != i[1:], True])
    for l, r in zip(bnds[:-1], bnds[1:]):
        if l+1 == r:
            res.setdefault(hA[i[l]], set()).add(hB[j[l]])
        else:
            res.setdefault(hA[i[l]], set()).update(itemgetter(*j[l:r])(hB))