2009-09-21 15 views
9

Mam problem. Mam zestaw 31 elementów zwanych kolorami. Mam również inną tablicę z liczbami całkowitymi, które zmieniają się od 0 do 31, nazywa się to c. Chcę utworzyć nową tablicę, w której wartości w c są teraz odpowiednimi wartościami w kolorach.Python error "indeksy list muszą być liczbami całkowitymi", są liczbami całkowitymi

piszę:

newarray = kolory [c]

ale pojawia się komunikat o błędzie "lista indeksów muszą być liczbami całkowitymi" ale c jest tablicą liczb całkowitych. Jestem nowym użytkownikiem Pythona i nie mam czasu na wykonanie samouczków, ponieważ potrzebuję go do wykonania określonego zadania kreślenia. Czy ktoś mógłby mi pomóc? !

Dzięki

+0

tablica c ma około 6000 elementów wszystkich wartości całkowitych od 0 do 31. –

+0

Być może powinieneś dokładnie wyjaśnić, co próbujesz zrobić. Poza kontekstem nie rozumiem, dlaczego lista "C" miałaaby 6000 wartości całkowitych z zakresu od 0 do 31 –

Odpowiedz

16

tablica liczb = całkowita

lista indeksów muszą być liczbami całkowitymi - dałeś listę liczb całkowitych.

Prawdopodobnie chcesz wyrażeń listowych:

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

Ale naprawdę powinien nauczyć się języka prawidłowo przed użyciem. To nie jest tak, że pyton potrzebuje dużo czasu, aby się uczyć.

EDIT:

Jeśli wciąż otrzymuję ten sam błąd wtedy swoje twierdzenie, że c jest lista liczb całkowitych jest nieprawidłowy.

Spróbuj:

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

Wtedy możemy wypracować jakiego rodzaju masz. Również pomocna byłaby short but complete example i prawdopodobnie wiele dowiesz się o swoim problemie.

EDIT2:

Więc jeśli c jest rzeczywiście lista ciąg, należy prawdopodobnie wspomniałem to, struny nie są automatycznie konwertowane do liczb całkowitych, w przeciwieństwie do niektórych innych języków skryptowych.

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

Edit3:

Oto minimalny kod, który demonstruje kilka poprawek:

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 musi być 32 pozycje długie. b) elementy z c (i) na liście muszą być konwertowane na liczby całkowite (int(i)).

+0

, dziękuję za twój wpis, jednak kiedy piszę powyższe polecenie, ten sam komunikat o błędzie jest zwracany. –

+0

Myślę, że to dlatego, że elemanty tablicy c są przechowywane jako łańcuchy. Kiedy piszę: typ (c [1]) Otrzymuję komunikat " i tak myślę, że trzeba je zmienić, aby wpisać" int ". Mam problem z tym, ponieważ nie mogę zmienić –

+0

Sądzę, że oboje napisaliśmy, że w tym samym czasie ... Kolory są również ciągami –

1

Python nie obsługuje automatycznego indeksowania listy. Możesz użyć pojedynczego indeksu całkowitego, takiego jak c [4] lub plasterka takiego jak c [4:10]. SciPy Biblioteka ma bogatsze możliwości indeksowania. Lub po prostu użyj wyrażeń listowych jako porad Douglasa Leedera.

1

Dobra, myślę, że wiem, po co ...

Masz więc listę 31 kolorów. Powiedzieć argumentem jest to lista z 31 strun tak ...

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

I „c” jest tablicą liczb w zakresie od 0 do 31, ale w przypadkowej kolejności ...

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] 

i co chcesz zrobić, to odwzorować wartości w C jako wskaźnik na listę kolorów, tak aby skończyć z listy kolorów jak zaindeksowane przez C iw tej kolejności ...

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

Jeśli to nie jest to, czego chcesz, musisz zmienić swoje pytanie!

Myślę, że masz podstawowy problem, ponieważ lista kolorów powinna zawierać 32 elementy (kolory), a nie 31, jeśli lista "c" jest losowym losowaniem wszystkich liczb z zakresu od 0 do 31 (to jest 32 liczby, widzicie).

+0

Tablica c ma ponad 6000 elementów z zakresu od 0 do 31. –

2

To jest Twój kod: (z komentarzem)

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() 

Nie wiedząc dokładnie, co dane jest, albo co próbujesz osiągnąć, bym Proponuję próbuje w ten sposób:

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

dane składają się z współrzędnych a (zakres -180 do 180) i b (zakres -90 do 90) supernowych.Wartość c opisuje właściwość SN, która została zwrócona z niektórych funkcji Matlaba. Chcę wykreślić te dane na wykresie rzutowania młotkiem, gdzie wartość c zostanie opisana przez gradient kolorów. tzn. gdy c = 0, kolor będzie żółty, a gdy c = 31, kolor będzie niebieski, a wszystkie inne wartości będą liniowo skalowane pomiędzy tymi kolorami. Podążyłem za twoją radą, ale po linii działki otrzymałem komunikat "długość sekwencji wynosi 6643, musi być 3 lub 4" –

+0

Przepraszam, że właśnie widziałem błąd w tym, co napisałem, ostatnia linia powinna brzmieć: p = fabuła ([a], [b], "o", mfc = newarray): Myślę, że problem jest tutaj, nie sądzę, że może on narysować każdy punkt (a, b) z tym samym elementem newarray. –

+0

Podczas wysyłania komunikatów o błędach dobrze byłoby powiedzieć nam, która linia jest przyczyną problemu. –

0

Jeśli kolory są również integer s lub float s, jest o wiele łatwiej naprawić przy użyciu Numpy:

import numpy as np 
newarray = np.array(colors)[c] 
Powiązane problemy