类型错误:不可散列的类型:'numpy.ndarray'

问题描述 投票:0回答:3

从包含三列数据的文本文件中,我希望能够从所有三列中获取

slice
数据,其中第一列中的值等于
above
中定义的值。然后我想将数据切片放入一个名为
slice
的新数组中(我使用的是 Python 2.7

above = range(18000, 18060, 5)

data = np.loadtxt(open('data.txt'), delimiter=None)

energies = (np.hsplit(data, 3))[0]

slice = set(energies)&set(above)

以上返回:

Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    set(energies)&set(above)
TypeError: unhashable type: 'numpy.ndarray
python numpy
3个回答
55
投票

你的变量

energies
可能有错误的形状:

>>> from numpy import array
>>> set([1,2,3]) & set(range(2, 10))
set([2, 3])
>>> set(array([1,2,3])) & set(range(2,10))
set([2, 3])
>>> set(array([[1,2,3],])) & set(range(2,10))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'numpy.ndarray'

如果您使用您的方法读取柱状数据,就会发生这样的情况:

>>> data
array([[  1.,   2.,   3.],
       [  3.,   4.,   5.],
       [  5.,   6.,   7.],
       [  8.,   9.,  10.]])
>>> hsplit(data,3)[0]
array([[ 1.],
       [ 3.],
       [ 5.],
       [ 8.]])

也许你可以简单地使用

>>> data[:,0]
array([ 1.,  3.,  5.,  8.])

相反。

(P.S.您的代码看起来尚未决定是

data
还是
elementdata
。我认为这只是一个拼写错误。)


5
投票

numpy.ndarray
可以包含任何类型的元素,例如
int
float
string
等。检查类型并在必要时进行转换。


0
投票

如果您在尝试使用

set
获取 numpy ndarray 中的唯一值时遇到此错误,请考虑使用
np.unique
代替。它还会展平多维数组。例如:

arr1 = np.array([[1, 2], [3, 1]])
unique_arr1 = np.unique(arr1)        # array([1, 2, 3])

如果你想找到两个数组之间的交集(这似乎是OP中的动机),那么你可以使用

np.intersect1d
代替
set.intersection

arr2 = np.array([1, 3, 4, 5])
np.intersect1d(unique_arr1, arr2)    # array([1, 3])

对于工会:

np.union1d(unique_arr1, arr2)        # array([1, 2, 3, 4, 5])

此错误(看似与散列 numpy ndarrays 无关)可能出现的另一种方式是,如果您在 pandas Series 和 numpy ndarray 上使用 numpy 统计函数,例如

max
std
等。例如:

a = pd.Series([1, 2])
b = np.array([3, 1])
np.max(a, b)                 # TypeError: unhashable type: 'numpy.ndarray'
np.max((a, b))               # OK

这是因为

max
的第二个参数是
axis=
,所以传递两个数组并不是计算这些对象最大值的正确方法;它们必须包含在元组/列表中。

© www.soinside.com 2019 - 2024. All rights reserved.