TypeError: tipo no modificable: ‘numpy.ndarray’

2 minutos de lectura

avatar de usuario
usuario1171835

De un archivo de texto que contiene tres columnas de datos, quiero poder simplemente tomar una slice de datos de las tres columnas donde los valores en la primera columna son iguales a los valores definidos en above. Luego quiero poner la porción de datos en una nueva matriz llamada slice (Estoy usando Pitón 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)

Lo anterior vuelve con:

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

tu variable energies probablemente tiene la forma incorrecta:

>>> 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'

Y eso es lo que sucede si lee datos en columnas usando su enfoque:

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

Probablemente puedas simplemente usar

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

en cambio.

(PD: parece que su código no está decidido sobre si es data o elementdata. He asumido que es simplemente un error tipográfico.)

  • Muchas gracias por esta respuesta. Funcionó perfectamente y me aclaró las cosas. El data/elementdata fue de hecho un error tipográfico.

    – usuario1171835

    27 de enero de 2012 a las 11:24

  • La diferencia de forma aquí es entre una matriz numpy 1D hashable y 2D no hashable.

    –James McGuigan

    23 de mayo de 2020 a las 11:21

avatar de usuario
Joni

numpy.ndarray puede contener cualquier tipo de elemento, por ejemplo int, float, string etc. Verifique el tipo y haga una conversión si es necesario.

¿Ha sido útil esta solución?