Seite 1 von 1
ndarray und append
Verfasst: Mittwoch 26. August 2009, 13:51
von DanielMamba
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
Verfasst: Mittwoch 26. August 2009, 14:06
von The Spirit
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?
Verfasst: Mittwoch 26. August 2009, 14:22
von DanielMamba
OK, das kann gut sein, dass da der Fehler liegt. Danke!
Verfasst: Mittwoch 26. August 2009, 14:35
von CM
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([...])
Verfasst: Mittwoch 26. August 2009, 15:02
von HWK
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
Verfasst: Mittwoch 26. August 2009, 15:03
von DanielMamba
danke, ich werd das mal ausprobieren. die funktion soll vektoren durch auffüllen mit Nullen gleichlang machen.
Danke, viele grüsse, DanielMamba
Verfasst: Mittwoch 26. August 2009, 15:23
von DanielMamba
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
Verfasst: Mittwoch 26. August 2009, 15:23
von CM
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
Verfasst: Mittwoch 26. August 2009, 15:32
von EyDu
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

Verfasst: Mittwoch 26. August 2009, 15:42
von DanielMamba
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
Verfasst: Mittwoch 26. August 2009, 15:55
von CM
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
Verfasst: Mittwoch 26. August 2009, 16:03
von CM
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.
Verfasst: Mittwoch 26. August 2009, 16:23
von DanielMamba
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
Verfasst: Mittwoch 26. August 2009, 20:45
von CM
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
Verfasst: Donnerstag 27. August 2009, 11:22
von DanielMamba
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
Verfasst: Donnerstag 27. August 2009, 11:37
von CM
Gut, kam mir nur komisch vor und wollte ggf. warnen.
Viel Erfolg!
Christian
Verfasst: Donnerstag 27. August 2009, 13:49
von DanielMamba
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
Verfasst: Freitag 28. August 2009, 07:39
von CM
Und jetzt solltest Du vielleicht noch lernen, dass import Statement nicht in Funktionen zu schreiben ...