Python OrderedDicts等于容差

时间:2017-11-13 00:59:13

标签: python numpy

我有100个OrderedDicts,比如,

foo =  OrderedDict({
    'a': -0.1011,
    'b': 3.2022,
    'c': 0.0
})

其中一些可能是平等的。对于像foo这样的100个词组的列表,我想找到唯一项的索引,如果给定项的值不等于任何其他词典的值,则给定项是唯一的,容差为0.01 。重要的是,我们可以假设列表中所有OrderedDicts的键的顺序是相同的。所以我可以做np.isclose(foo.values(), baz.values(), atol=0.01),但是我必须循环10000次才能比较它们;实际上,我可以在飞行中忽略那些被发现冗余的b / c。但有没有更有效的方法来做到这一点?

另一种方法是:uniques = {tuple(x.values()) for x in list_of_ord_dicts},但我怎么能在这里加入公差?

2 个答案:

答案 0 :(得分:0)

这可能是矫枉过正但它应该运行得很快并且易于阅读。它运行K-Means算法以在.01内查找聚类。你需要sklearn。

from collections import OrderedDict
from random import random
from copy import copy
import pandas as pd
from sklearn import cluster

hundred_dicts = [OrderedDict(a=random(), b=random(), c=random()) for _ in range(90)]
hundred_dicts.extend(copy(hundred_dicts[:10]))

df = pd.DataFrame(hundred_dicts)
kmeans = cluster.KMeans(
        n_clusters=len(hundred_dicts),
        random_state=0,
        tol=0.01).fit(df)
labels = kmeans.labels_
df['cluster'] = kmeans.labels_
df = df.drop_duplicates(subset='cluster')

答案 1 :(得分:0)

如果stuff是dicts列表,我希望我的容差为d小数:

import numpy as np
_, ind = np.unique(np.array([np.round(s.values(), d) for s in stuff]), axis=0, return_index=True)

其中ind是引用唯一字母的stuff的索引。