在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实例不相等吗?相关页面对这件事没有太大帮助。我可以看看sklearn源代码,但它继承了多个类,我想知道这里的人是否能够更快地解释。

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

>>> class A(object):
...     def __init__(self, thing):
...         self.thing = thing
>>> b = A(1)
>>> c = A(1)
>>> b == c
False

如果您创建了同一事物的两个副本(本例中为MiniBatchKMeans),而没有对它们进行酸洗,那么它们的比较是否相等?如果是这样的话,那么你可能想用scikit来引发一个bug。如果没有,那么您可能想向scikit提出功能请求!

相关内容

  • 没有找到相关文章

最新更新