Python 矩阵作为字典键

Python 矩阵作为字典键,python,dictionary,numpy,Python,Dictionary,Numpy,我刚刚开始使用numpy及其matrix模块(非常有用!),我想使用matrix对象作为字典的键,因此我检查了matrix是否实现了\uuuuuhash\ucode>方法: >>> from numpy import matrix >>> hasattr(matrix, '__hash__') True 的确如此!很好,这意味着它可以是字典的键: >>> m1 = matrix('1 2 3; 4 5 6; 7 8 9') >>

我刚刚开始使用
numpy
及其
matrix
模块(非常有用!),我想使用matrix对象作为字典的键,因此我检查了
matrix
是否实现了
\uuuuuhash\ucode>方法:

>>> from numpy import matrix
>>> hasattr(matrix, '__hash__')
True
的确如此!很好,这意味着它可以是字典的键:

>>> m1 = matrix('1 2 3; 4 5 6; 7 8 9')
>>> m1
matrix([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])
>>> m2 = matrix('1 0 0; 0 1 0; 0 0 1')
>>> m2
matrix([[1, 0, 0],
        [0, 1, 0],
        [0, 0, 1]])
>>> matrix_dict = {m1: 'first', m2: 'second'}
成功了!现在,让我们继续测试:

>>> matrix_dict[m1]
'first'
>>> matrix_dict[matrix('1 2 3; 4 5 6; 7 8 9')]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: matrix([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])
因此,来自
numpy
矩阵
\uuuuu散列
方法为相同的
矩阵
返回不同的值


是这样吗?那么,这是否意味着它不能用作字典键?如果不能使用它,为什么要实现它?

使用可变对象作为字典的键是错误的,因为它的散列应该在您更改数据时立即更改,但插入时使用的值将保留

在我的测试中,Python 3.2.2中的numpy引发了一个类型错误:

TypeError: unhashable type: 'matrix'
但是在Python2.7上,它仍然允许散列,但是当您更改数据时,散列值永远不会更改,因此它作为字典键是非常无用的,因为许多添加到字典中具有相同散列的
矩阵
对象将降级散列表,因此插入将是
O(n^2)
而不是
O(1)


也许他们没有删除散列值以避免破坏Python2.x上的一些API,但不要依赖它

Python对象在默认情况下是可散列的——您必须对不可散列的类禁用它。可能只是
numpy
的一部分遗漏。矩阵下面是一个数组,它们默认也是可散列的-我想你使用它们也会遇到同样的问题。@jozzas,我很惊讶可以将矩阵用作字典键,因为我知道ndarray不能用作键,而矩阵是ndarray的子类
TypeError: unhashable type: 'matrix'