在 Python 中测试 unpickled 字典

Testing unpickled dictionary in Python

我正在使用 cPickle 来存储一个字典,其项是 sklearn.cluster 中进行 k 均值聚类的聚类对象。我在解酸洗时得到的字典看起来不错并且似乎可以工作。但是,当我将它与输入字典进行相等性比较时,它的计算结果为 False.

amino_acid = 'ILE'
clusterers = {'2 ILE_chi1': MiniBatchKMeans(...),
              '2 ILE_chi2': MiniBatchKMeans(...)}
output = open(''.join([amino_acid, '.pkl']), 'wb')
cPickle.dump(clusterers, output, -1)
output.close()
# Test that we can unpickle it.
input = open(''.join([amino_acid, '.pkl']), 'rb')
unpickled = cPickle.load(input)
print type(unpickled)
if clusterers == unpickled:
    print "Pickled successfully."
    print clusterers
else:
    print "Didn't pickle."
    print unpickled
    print clusterers
    print type(unpickled['2 ILE_chi1'])
    print unpickled.keys() == clusterers.keys()
    print unpickled.values() == clusterers.values()
input.close()

对应输出:

Didn't pickle.
{'2 ILE_chi1': MiniBatchKMeans(...), '2 ILE_chi2': MiniBatchKMeans(...)}
{'2 ILE_chi1': MiniBatchKMeans(...), '2 ILE_chi2': MiniBatchKMeans(...)}
<class 'sklearn.cluster.k_means_.MiniBatchKMeans'>
True
False

有谁知道为什么 MiniBatchKMeans 个实例不相等? relevant page 在这个特定问题上不是很有帮助。我可以看一下 sklearn 源代码,但它继承自多个 类,我想知道这里是否有人可以更快地解释。

除非有人明确地在对象上添加 eq(或类似的)方法,否则对象不会比较相等:

>>> class A(object):
...     def __init__(self, thing):
...         self.thing = thing

>>> b = A(1)
>>> c = A(1)
>>> b == c
False

如果您创建同一事物的 2 个副本(在本例中为 MiniBatchKMeans),而不对它们进行酸洗,它们比较相等吗?如果是这样,那么您可能想使用 scikit 提出错误。如果没有,那么您可能想使用 scikit 提出功能请求!