2009-09-21 14 views
9

Tengo un problema. Tengo una matriz de 31 elementos llamados colores. También tengo otra matriz con números enteros que varían entre 0 y 31, esto se llama c. Quiero producir una nueva matriz donde los valores en c son ahora los valores correspondientes en colores.python error "los índices de lista deben ser enteros", son enteros

escribo:

newArray = colores [c]

pero reciben el mensaje de error "índices de la lista deben ser enteros", pero C es una matriz de enteros. Soy nuevo en Python y no tengo tiempo para hacer los tutoriales, ya que solo los necesito para una tarea de trazado específica. ¿Alguien podría darme una mano? !

Gracias

+0

el conjunto llamado c tiene alrededor de 6000 elementos, todos los valores enteros entre 0 y 31. –

+0

Quizás deba explicar exactamente lo que está tratando de hacer. Fuera de contexto, no entiendo por qué la lista callec 'c' tendría 6000 valores enteros en el rango de 0 a 31 –

Respuesta

16

matriz de enteros = entero

índices de la lista deben ser enteros - que ha dado una lista de números enteros.

es probable que desee una lista de comprensión:

newarray = [ colors[i] for i in c ] 

Pero que realmente debería aprender el idioma correctamente antes de usarlo. No es que Python tarde mucho tiempo en aprender.

EDIT:

Si sigue recibiendo el mismo error, entonces su afirmación de que c es una lista de números enteros es incorrecto.

Inténtelo:

print type(c) 
print type(c[0]) 
print type(colors) 
print type(colors[0]) 

entonces podemos trabajar en lo tipos que tienes. También un short but complete example ayudaría, y probablemente le enseñaría mucho sobre su problema.

Edit2:

Así que si c es en realidad una lista de cadenas, debería haber mencionado probablemente esto, las cadenas no se convierten automáticamente a números enteros, a diferencia de otros lenguajes de script.

newarray = [ colors[int(i)] for i in c ] 

Edit3:

Aquí hay un código mínimo que demuestra un par de correcciones de errores:

x=["1\t2\t3","4\t5\t6","1\t2\t0","1\t2\t31"] 
a=[y.split('\t')[0] for y in x] 
b=[y.split('\t')[1] for y in x] 
c=[y.split('\t')[2] for y in x] # this line is probably the problem 
colors=['#FFFF00']*32 
newarray=[colors[int(i)] for i in c] 
print newarray 

a) colors tiene que ser de 32 entradas de largo. b) los elementos de c (i) en la lista de comprensión deben convertirse a enteros (int(i)).

+0

gracias por su publicación, sin embargo, cuando escribo el comando como se muestra arriba, se devuelve el mismo mensaje de error. –

+0

Creo que es porque los elementos de la matriz c se almacenan como cadenas. Cuando escribo: tipo (c [1]) Aparece el mensaje " y entonces creo que necesito cambiarlos para escribir" int ". Tengo problemas para hacer esto ya que no puedo cambiar todos ellos a la vez. –

+0

Supongo que ambos escribimos eso al mismo tiempo. Colors también es una cadena –

1

Python no admite la indexación de listas arbitrarias. Puede usar un índice entero simple como c [4] o cortar como c [4:10]. SciPy biblioteca tiene capacidades de indexación más ricas. O simplemente use listas de comprensión como consejos de Douglas Leeder.

1

Bueno, creo que sé lo que buscas ...

Así que tiene su lista de 31 colores. Digamos por argumento es una lista de 31 cuerdas como esta ...

colours = [ "Black", "DarkBlue", "DarkGreen", ... "White" ] 

Y 'C' es una serie de números en el rango de 0 a 31, pero en orden aleatorio ...

import random 
c = [x for x in xrange(32)] 
random.shuffle(c) 
# 'c' now has numbers 0 to 31 in random order 
# c = [ 2, 31, 0, ... 1] 

y lo que quiere hacer es asignar los valores de c como un índice en la lista de colores para que usted termina con una lista de colores en que un índice por C y en ese orden ...

mapped = [color[idx] for idx in c] 
# mapped has the colors in the same order as indexed by 'c' 
# mapped = ["DarkGreen", "White", "Black", ... "DarkBlue"] 

Si eso no es lo que quieres, entonces necesitas revisar tu ¡pregunta!

Creo que tienes un problema básico en que tu lista de colores debe tener 32 elementos (colores), no 31, si la lista 'c' es una mezcla aleatoria de todos los números en el rango de 0 a 31 (eso es 32 números, ves).

+0

la matriz c tiene más de 6000 elementos con un rango de 0-31. –

2

Este es su código: (a partir de su comentario)

from pylab import* 
f=open("transformdata.txt") 
x=f.readlines() 
a=[y.split('\t')[0] for y in x] 
b=[y.split('\t')[1] for y in x] 
c=[y.split('\t')[2] for y in x] # this line is probably the problem 
subplot(111,projection="hammer") 
colors=['#FFFF00']*31 
newarray=[colors [i] for i in c] 
p=plot([a],[b],"o",mfc=color) show() 

Sin saber exactamente lo que sus datos están, o lo que estamos tratando de lograr, sugeriría probar este:

c=[int(y.split('\t')[2]) for y in x] 
+0

los datos constan de coordenadas a (rango -180 a 180) yb (rango -90 a 90) de supernovas.El valor c describe una propiedad del SN que se ha devuelto de algunas funciones de Matlab. Quiero trazar estos datos en el diagrama de proyección del martillo donde el valor de c se describirá por un gradiente de color. es decir, cuando c = 0 el color será amarillo y cuando c = 31 el color será azul y todos los demás valores se escalarán linealmente entre estos colores. He seguido su consejo, pero después de la trama recibo el mensaje "la longitud de la secuencia es 6643; debe ser 3 o 4" –

+0

lo siento, acabo de ver un error en lo que he escrito, la última línea debería decir: p = plot ([a], [b], "o", mfc = newarray): Creo que el problema está aquí, no creo que pueda trazar cada punto (a, b) con el mismo elemento de newarray. –

+0

Al dar mensajes de error, sería bueno que nos diga qué línea estaba causando el problema. –

0

Si los colores son también integer s o float s, hay una solución mucho más fácil usando Numpy:

import numpy as np 
newarray = np.array(colors)[c] 
Cuestiones relacionadas