我使用cPickle
来存储一个词典,该词典的项目是来自sklearn.cluster
的聚类对象,这些对象执行k-means聚类。在unpickling看到的字典看起来很好,似乎工作。但是,当我将它与输入字典进行比较时,它的计算结果为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
源代码,但它继承了多个类,我想知道这里是否有人能够更快地解释。
答案 0 :(得分:3)
除非有人明确地在其上添加 eq (或类似)方法,否则对象不会相等:
>>> class A(object):
... def __init__(self, thing):
... self.thing = thing
>>> b = A(1)
>>> c = A(1)
>>> b == c
False
如果你创建同一件事的两个副本(在这种情况下是MiniBatchKMeans),没有腌制它们,它们是否相等?如果是这样,那么你可能想用scikit提出一个错误。如果没有,那么您可能想要使用scikit提出功能请求!