6
如果
matrix
有
__hash__
方法來實現
我剛剛使用numpy
及其matrix
模塊(非常非常有用!)開始,我想用一個矩陣對象作爲字典的關鍵,所以我檢查:矩陣作爲字典鍵
>>> 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]])
什麼?所以,它適用於相同的矩陣,但它不適用於具有完全相同內容的另一個矩陣?讓我們來看看__hash__
回報:
>>> hash(m1)
2777620
>>> same_as_m = matrix('1 2 3; 4 5 6; 7 8 9')
>>> hash(same_as_m)
-9223372036851998151
>>> hash(matrix('1 2 3; 4 5 6; 7 8 9')) # same as m too
2777665
所以,從matrix
回報numpy
不同值的相同matrix
的__hash__
方法。
這是正確的嗎?那麼,這是否意味着它不能用作字典鍵?如果不能使用,爲什麼要執行__hash__
?
默認情況下Python對象是可散列的 - 您必須爲不可用的類禁用它。可能僅僅是'numpy'的一部分。 – millimoose 2012-01-11 02:06:51
矩陣是一個ndarray,默認情況下它們也是可散列的 - 我假設你也有同樣的問題。 – jozzas 2012-01-11 02:41:41
@jozzas,我很驚訝有可能使用矩陣作爲字典鍵,因爲我知道ndarrays不能用作鍵,矩陣是ndarray的子類 – 2012-01-11 02:54:59