不可用的类型错误

时间:2016-12-04 14:18:07

标签: python python-2.7 numpy

尝试这样做:

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

并收到此错误:

TypeError: unhashable type: 'numpy.ndarray'
如果有人能帮助我,我们将不胜感激。

3 个答案:

答案 0 :(得分:2)

使用itertools.izip(ls,rs)时,第一列将包含numpy数组,这些数组不能用作字典键。

您必须将它们转换为像tuple这样的可散列迭代。此外,如果您想沿着第二个轴连接两个numpy数组,最好使用np.column_stack()而不是itertools.izip()

同样不清楚getColA对象是什么以及它返回的是什么。也许您可以修改该可调用对象以获得更合适的结果。

答案 1 :(得分:0)

dict必须将密钥设置为可缓存类型。

您正在尝试使用不可散列类型(numpy.ndarray)创建类型。

这就是您收到此错误的原因。

在你的情况下,你可以这样做:

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

答案 2 :(得分:0)

有几件事情没有意义

ls = np.empty
ls =getColA()

np.empty是一个功能。您将其分配给ls;然后将getColA()的结果分配给ls。这抹去了第一个任务。您是否认为第一个赋值将ls变量定义为数组?这不是Python的工作方式。变量没有类型。

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

您没有告诉我们getColA()返回什么,但错误表明它是一个数组。 1D? 2D?

这种字典构建适用于1d数组(我正在使用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.]))]

为什么要将数组用作字典键?