Ständiger Error: 'int' object is not iterable

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Snowdisco
User
Beiträge: 3
Registriert: Donnerstag 11. September 2014, 18:22

Donnerstag 11. September 2014, 18:27

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 11. September 2014, 19:57

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3))
assert encoding_kapiert
Snowdisco
User
Beiträge: 3
Registriert: Donnerstag 11. September 2014, 18:22

Donnerstag 11. September 2014, 21:53

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?
BlackJack

Donnerstag 11. September 2014, 22:00

@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.
Snowdisco
User
Beiträge: 3
Registriert: Donnerstag 11. September 2014, 18:22

Freitag 12. September 2014, 00:49

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.
Benutzeravatar
snafu
User
Beiträge: 5590
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 12. September 2014, 06:49

``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.
shcol (Repo | Doc | PyPi)
Benutzeravatar
MagBen
User
Beiträge: 786
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Freitag 12. September 2014, 07:34

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()
a fool with a tool is still a fool, www.magben.de, YouTube
BlackJack

Freitag 12. September 2014, 08:53

@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.
Antworten