ndarray und append

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
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

Hi ich hab nen kleines Problem:

bei folgender Funktion bekomm ich den Fehler, dass numpy.ndarray kein attribut append besitze:

Code: Alles auswählen

def zeroMaker(dist1, dist2):
    from numpy import size, fabs, append
    vector1 = dist1
    vector2 = dist2
    ii = 0
    a = size(vector1)
    b = size(vector2)
    if a < b:
        while ii < fabs(a-b):
            vector1.append(0)
            ii += 1
    elif a > b:
        while ii < fabs(a-b):
            vector2.append(0)
            ii += 1
    else:
        print 'Vectors have same number of elements'
Führe ich dann alles direkt als skript aus, also nicht als Funktion, geht es. Woran könnte das liegen?

Grüsse, DanielMamba
The Spirit
User
Beiträge: 276
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

wenn ich deine code in idle kopiere und dann mit

Code: Alles auswählen

>>> zeroMaker([1,2],[3,4])
Vectors have same number of elements
ausführe klappt alles.

vielleicht bei der übergabe von dist1 und dist2 ein fehler?
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

OK, das kann gut sein, dass da der Fehler liegt. Danke!
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

was soll denn die Funktion machen - außer None zurückgeben?

Gruß,
Christian

PS Das numpy ndarrays kein Attribut 'append' besitzen ist richtig, aber numpy besitzt sehr wohl eine entsprechende Funktion:

Code: Alles auswählen

x = numpy.array([...])
new_x = numpy.append(x, numpy.array([...])
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

CM hat geschrieben:aber numpy besitzt sehr wohl eine entsprechende Funktion:
..., die er ja auch unnötigerweise importiert hat. Auch hätte wohl Pythons abs-Funktion statt fabs ausgereicht.
MfG
HWK
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

danke, ich werd das mal ausprobieren. die funktion soll vektoren durch auffüllen mit Nullen gleichlang machen.

Danke, viele grüsse, DanielMamba
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

falls ich aber ein array habe und ich möchte hinten, also nach der letzten Position eine 0 anfügen, funktioniert das nicht mit append.

Hat jemand eine Idee? Viele Grüsse, DanielMamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Code: Alles auswählen

from numpy import arange, zeros
x = arange(1,6)
y = zeros(10)
y[0:x.shape[0]] = x
Hilft das? Und vergesse nicht ein "return" in die entsprechende Funktion zu setzen.

Wenn die arrays rel. groß sein sollte, solltest Du vielleicht auch numexpr einsetzen, damit das einigermaßen performant ist.

Weiß jemand eine elegantere Methode für das Problem? Ich bin mir fast sicher, komme aber gerade nicht drauf.

Gruß,
Christian
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Zeilen 4 und 5 kannst du dir sparen, dort werden nur Referenzen kopiert. Die while-Schleifen kannst du durch eine for-Schleife ersetzen, die Unterscheidung für vector1 und vector2 kannst du einmal vorher erledigen. Ein Blick in PEP 8 lohnt sich wahrscheinlich auch ;-)
Das Leben ist wie ein Tennisball.
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

EyDu hat geschrieben:Zeilen 4 und 5 kannst du dir sparen, dort werden nur Referenzen kopiert. Die while-Schleifen kannst du durch eine for-Schleife ersetzen, die Unterscheidung für vector1 und vector2 kannst du einmal vorher erledigen. Ein Blick in PEP 8 lohnt sich wahrscheinlich auch ;-)
ja das stimmt, trotzdem löst es aber das eigentliche problem nicht.
Ich will ja einfach schauen, ob 2 arrays dieselbe Länge haben, falls dies nicht der Fall ist, soll das kürzere der beiden so lange mit 0 aufgefüllt werden, bis sie gleichlang sind.

Danke, gruss Mamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Quick & dirty:

Code: Alles auswählen

from numpy import arange, zeros

def zeropad(ar1, ar2):
   lar1  = len(ar1)
   lar2  = len(ar2)
   maxar = (ar1, ar2)[lar1 < lar2]
   minar = (ar1, ar2)[lar1 > lar2]

   tmp = zeros(len(maxar))
   tmp[0:minar.shape[0]] = minar

   return tmp, maxar

if __name__ == "__main__":
    x = arange(10)
    y = arange(20)
    print zeropad(x,y)
Beachte, das die Reihenfolge im Rückgabetuple ein wenig willkürig ist. Und das tmp ... Na ja, ein bißchen sollst Du auch noch basteln ;-)

HTH
Christian
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Oh, und wozu brauchst das Zero-Padding? Bei manchen Funktionen (z. B. FFTs) steht das Notwendige in der Doku - und man muß es nicht selber machen.
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

CM hat geschrieben:Oh, und wozu brauchst das Zero-Padding? Bei manchen Funktionen (z. B. FFTs) steht das Notwendige in der Doku - und man muß es nicht selber machen.
ich will mit zwei datenarrays nen pearson chi square test machen und da brauch ich zwei gleich lange vektoren.
Apropos, gibt es für python ne implementierung vom pearson? ich hab zwar schon eine implementiert, aber ne fertige wär als referenz nicht schlecht.

Danke und Grüsse,

Mamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

scipy.stats.chisquare()?

Und Du hälst es für eine gute Idee in diesem Fall zero-padding zu machen? Ist das bei diesen Daten wirklich möglich? (edit: möglich im Sinne von mathematisch möglich)

Gruß,
Christian
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

CM hat geschrieben:scipy.stats.chisquare()?

Und Du hälst es für eine gute Idee in diesem Fall zero-padding zu machen? Ist das bei diesen Daten wirklich möglich? (edit: möglich im Sinne von mathematisch möglich)
Hi, ja ist möglich...und macht durchaus Sinn in diesem Fall.

Danke und Grüsse, Mamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Gut, kam mir nur komisch vor und wollte ggf. warnen.

Viel Erfolg!
Christian
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

so das problem hab ich jetzt gelöst...folgende implementierung funktioniert uns ist auch kürzer:

Code: Alles auswählen

def zeroMaker(dist1, dist2):
    from numpy import size, fabs, append, zeros
    a = size(dist1)
    b = size(dist2)
    pad = zeros(fabs(a-b))
    if a < b:
        dist1 = append(dist1, pad)
    elif a > b:
        dist2 = append(dist2, pad)
    else:
        print 'Vectors have same number of elements'

    return dist1, dist2
vielen dank nochmals, grüsse, mamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Und jetzt solltest Du vielleicht noch lernen, dass import Statement nicht in Funktionen zu schreiben ...
Antworten