2016-12-04 77 views
0

試圖做到這一點:Unhashable類型的錯誤

ls = np.empty 
ls =getColA() 
rs = np.empty 
rs=getColG() 
x = dict(itertools.izip(ls,rs)) 

,並收到此錯誤:

TypeError: unhashable type: 'numpy.ndarray' 

將不勝感激,如果有人可以幫助我。

回答

0

A dict必須將密鑰設置爲可哈希類型。

您正嘗試使用非可散列類型(numpy.ndarray)創建一個類型。

這就是爲什麼你會得到這個錯誤。

在你的情況下,你可以這樣做:

x = dict(itertools.izip(tuple(ls),rs)) 
+0

我應該用什麼來代替?我有xlsx文件中的列,我需要組合爲元組 – Hassaan

+0

@Hassaan你必須使用像元組一樣的可排列類型,例如'x = dict(itertools.izip(tuple(ls),rs))' – user312016

+0

Thanks很多你的幫助 – Hassaan

2

當您使用itertools.izip(ls,rs)第一列將包含沒有可哈希站的字典鍵的numpy的陣列。

您必須將它們轉換爲可排序迭代,如tuple。另外如果你想連接兩個numpy陣列沿它們的第二軸,最好使用np.column_stack()而不是itertools.izip()

另外目前還不清楚getColA對象是什麼以及它返回的是什麼。也許你可以修改該可調用對象,以便獲得更加正確的結果。

+0

我如何渲染一個numpy數組hashable?或者我應該使用什麼數據結構作爲關鍵? – Hassaan

+0

@Hassaan *你必須將它們轉換爲像tuple一樣的可哈希迭代。另外,如果你想連接兩個numpy數組沿其第二軸,最好使用np.column_stack()而不是itertools.izip()。* – Kasramvd

+0

對不起,因爲變慢,我找到了你。謝謝 – Hassaan

0

有幾件事情是沒有意義

ls = np.empty 
ls =getColA() 

np.empty是一個函數。您將其分配給ls;那麼你將getColA()的結果分配給ls。這抹去了第一項任務。你認爲第一個作業將ls變量定義爲數組嗎?這不是Python的工作原理。變量沒有類型。

x = dict(itertools.izip(ls,rs)) 

你沒有告訴我們什麼getColA()返回,但錯誤表明它是一個數組。 1D? 2D?

這類詞典建築工程用一維數組(我使用PY3)

In [497]: dict(itertools.zip_longest(np.arange(3),np.arange(10,13))) 
Out[497]: {0: 10, 1: 11, 2: 12} 

但與2D

In [498]: dict(itertools.zip_longest(np.arange(6).reshape(2,3),np.ones((2,3)))) 
... 
TypeError: unhashable type: 'numpy.ndarray' 

這是因爲在2D的zip返回數組的行,並且行本身是陣列:

In [499]: list(itertools.zip_longest(np.arange(6).reshape(2,3),np.ones((2,3)) 
    ...:)) 
Out[499]: 
[(array([0, 1, 2]), array([ 1., 1., 1.])), 
(array([3, 4, 5]), array([ 1., 1., 1.]))] 

爲什麼要使用一個數組作爲字典鍵?

+0

getColA()從excel文件的單元格返回一些數據的數組。我想結合兩列不同的excel文件,以便將它們用作字典。 – Hassaan

+0

正如你所說,我是python的新手,並試圖掌握結構和語法。分配np.empty是試圖定義它的類型,但是如何變量在python中工作是困惑的。 – Hassaan

+0

你需要給出一個具體的例子,用實數和數組。字典鍵應該是什麼樣子的? – hpaulj