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

Code: Alles auswählen

emax=eigenwerte.max()
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

Code: Alles auswählen

summe= numpy.exp(eigenwerte/mu).sum()

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.