从包含三列数据的文本文件中,我希望能够从所有三列中获取
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
你的变量
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
。我认为这只是一个拼写错误。)
numpy.ndarray
可以包含任何类型的元素,例如int
、float
、string
等。检查类型并在必要时进行转换。
如果您在尝试使用
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=
,所以传递两个数组并不是计算这些对象最大值的正确方法;它们必须包含在元组/列表中。