Ошибка типа: не поддающийся хэшированию тип: ‘numpy.ndarray’

#python #pandas #matplotlib #linear-regression

#python #numpy

Вопрос:

Из текстового файла, содержащего три столбца данных, я хочу иметь возможность просто брать 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)amp;set(above)
  

Вышеприведенное возвращается с:

 Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    set(energies)amp;set(above)
TypeError: unhashable type: 'numpy.ndarray
  

Ответ №1:

Ваша переменная energies , вероятно, имеет неправильную форму:

 >>> from numpy import array
>>> set([1,2,3]) amp; set(range(2, 10))
set([2, 3])
>>> set(array([1,2,3])) amp; set(range(2,10))
set([2, 3])
>>> set(array([[1,2,3],])) amp; 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 . Я предположил, что это просто опечатка.)

Комментарии:

1. Большое вам спасибо за этот ответ. Это сработало идеально и прояснило для меня ситуацию. Данные / elementdata действительно были опечаткой.

2. Разница в форме здесь между хешируемым 1D и нехешируемым 2D массивом numpy.

Ответ №2:

numpy.ndarray может содержать элементы любого типа, например int , float , string и т.д. Проверьте тип и при необходимости выполните преобразование.