Seite 1 von 1
Ständiger Error: 'int' object is not iterable
Verfasst: Donnerstag 11. September 2014, 18:27
von Snowdisco
Guten Abend liebe Python-Programmierer,
ich bekomme ständig den Fehler "'int' object is not iterable":
Code: Alles auswählen
def nesterow(A,epsilon):
import numpy
import scipy
n = len(A)
mu = epsilon/numpy.log(n)
eigenwerte = numpy.linalg.eigvals(A)
print eigenwerte
emax=eigenwerte[0]
i=1
while i < len(eigenwerte):
if eigenwerte[i] > emax:
emax = eigenwerte[i]
i+=1
summe=0
j=0
for j in range(eigenwerte):
summe += numpy.exp(eigenwerte[j]/mu)
fmu=mu*numpy.log(summe)-mu*numpy.log(n)
return fmu
print emax
Der Fehler : 13 i+=1
14
---> 15 summe=0
16 j=1
17 for j in range(eigenwerte):
Und vorher auch schonmal in der for-Schleife. Kann mir jemand genauer erläutern, was es genau damit auf sich hat? Jegliche Google-Suchanfragen können mir kein vernünftiges Argument liefern, warum dieser Fehler dort geworfen wird.
Danke für eure Rückmeldung.
Re: Ständiger Error: 'int' object is not iterable
Verfasst: Donnerstag 11. September 2014, 19:57
von Hyperion
Der Fehler kommt dann, wenn Du über ein Objekt iterieren willst, welches das Iterator-Protokoll nicht unterstützt. Ein "atomares" Integer-Objekt bietet dies einfach nicht. ``for value in 8`` - was sollte denn Deiner Meinung nach bei so etwas passieren?
Dein ``eigenwert`` (wie der Name ja auch schon nahelegt) scheint einfach ein Integer zu sein und *keine* Liste oder ähnliche Struktur, die iterierbar wäre

Re: Ständiger Error: 'int' object is not iterable
Verfasst: Donnerstag 11. September 2014, 21:53
von Snowdisco
Die eigvals Funktion aus dem Numpy package gibt mir aber ja ein Array und keinen einzelnen Integerwert zurück? Daher dachte ich, dass ich über die range dieses Arrays iterieren kann?
Re: Ständiger Error: 'int' object is not iterable
Verfasst: Donnerstag 11. September 2014, 22:00
von BlackJack
@Snowdisco: Kannst Du mal bitte *genau* den Fehler zeigen, also einen kompletten Traceback und die dazugehörige Funktion.
Die beiden Schleifen in der gezeigten Funktion sind übrigens überflüssig. Der Witz an Numpy und seinen Arrays ist ja gerade das man weniger in langsamen Python-Schleifen und mehr mit Funktionen und Methoden auf Numpy-Arrays machen kann, die intern ablaufen und in C, Fortran, oder ähnlichem geschrieben wurden.
Re: Ständiger Error: 'int' object is not iterable
Verfasst: Freitag 12. September 2014, 00:49
von Snowdisco
Code: Alles auswählen
a = numpy.mat(a)
firststep.nesterow (a,0.01)
[ 0.46481624 2.86851709]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-14-06f3cd177dbe> in <module>()
----> 1 firststep.nesterow (a,0.01)
C:\Users\...\...\...\firststep.py in nesterow(A, epsilon)
15 j=0
16 for j in range(eigenwerte):
---> 17 summe += numpy.exp(eigenwerte[j]/mu)
18
19 fmu=mu*numpy.log(summe)-mu*numpy.log(n)
TypeError: only length-1 arrays can be converted to Python scalars
Dabei ist a eine symmetrische Matrix. Habe das Programm gerade eben geöffnet und unverändert gestartet, jetzt wirft Python plötzlich einen anderen Fehler (s.o.)? Kurios! Jedoch kann ich auch mit diesem Fehler nicht viel anfangen. Es werden zur Summe doch einfach nach und nach float-Werte addiert, was hat er da für einen Konvertierungsfehler?
Rein intuitiv bedeutet der Fehler für mich, das er einem Zahlenwert ein Array zuweisen will, was natürlich nicht geht. Aber das Problem sehe ich hier nicht, habe es auch mit math.exp(eigenwerte[j]/mu) probiert.
Re: Ständiger Error: 'int' object is not iterable
Verfasst: Freitag 12. September 2014, 06:49
von snafu
``range()`` nimmt als Argument nur etwas vom Typ `int`. Da dein Code offenbar die Zeile mit `range(eigenwerte)` erfolgreich durchlaufen hat, muss`eigenwerte` also ein Integer sein. Und dann ist klar, dass der nachfolgende Indexzugriff fehlschlägt, da Integer nun mal keinen Index haben.
Re: Ständiger Error: 'int' object is not iterable
Verfasst: Freitag 12. September 2014, 07:34
von MagBen
Code: Alles auswählen
while i < len(eigenwerte):
if eigenwerte[i] > emax:
emax = eigenwerte[i]
i+=1
Wenn die Eigenwerte nicht in aufsteigender Reihenfolge sortiert sind, dann ist das eine Endlosschleife.
Folgendes hast Du wahrscheinlich gemeint
Code: Alles auswählen
while i < len(eigenwerte):
if eigenwerte[i] > emax:
emax = eigenwerte[i]
i+=1
Aber auch so macht man das nicht in Python, sondern so
Code: Alles auswählen
for i in range(len(eigenwerte)):
if eigenwerte[i] > emax:
emax = eigenwerte[i]
oder so
Code: Alles auswählen
for eigenwert in eigenwerte:
if eigenwert > emax:
emax = eigenwert
Und mit Numpy geht es noch einfacher
Deine Schleife für die Summe kannst Du mit for so schreiben
Code: Alles auswählen
for j in range(len(eigenwerte)):
summe += numpy.exp(eigenwerte[j]/mu)
Du brauchst j vorher nicht zu initialisieren (Zeile 16 im ersten Beitrag).
Das hier ist aber effektiver wenn Du Numpy benutzt
Re: Ständiger Error: 'int' object is not iterable
Verfasst: Freitag 12. September 2014, 08:53
von BlackJack
@MagBen: Beide Beispiele mit Schleifen über ``range(len(eigenwerte))`` sollte man so nicht in Python schreiben. Das ist ein „anti pattern”.
Ergänzend: Wenn man etwas hat was keine `max()`-Methode hat, kennt Python auch eine eingebaute `max()`-Funktion. Und eine `sum()`-Funktion gäbe es auch.