Arrays - zwei kurze Fragen

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.
OTB
User
Beiträge: 15
Registriert: Samstag 24. März 2007, 17:54

Arrays - zwei kurze Fragen

Beitragvon OTB » Samstag 24. März 2007, 19:05

hallo

kennt sich hier jemand mit numeric/nummarray/numpy - arrays aus?

wie kann ich folgende einfache funktion durch einen
array-befehl ersetzen:

Code: Alles auswählen

def fire(V,y=0):
    V_out=[]
    for i in V:
        if i > y:v=1
        else: v=-1
        V_out.append(v)
    return V_out


aus performance-gründen soll es so einfach und schnell wie möglich sein.
(keine umwandlung des datentypes etc.)
mit numpy.arrays habe ich bisher nur diese methode gefunden,
die aber meinen vorstellungen nicht entspricht.

Code: Alles auswählen

>>> array_V > 0
array([True, True, False, True], dtype=bool)


ich benötige anstatt True/False zahlenwerte. (z.B 1/0 oder 1/-1, allgemein: x/y)


ausserdem möchte ich einen array mit zufallszahlen im bereich [-1,1] erzeugen.
bisher weis ich nur wie das im bereich [0,1] geht:

Code: Alles auswählen

numpy.random.rand(n,m)

# erzeugt eine n-m-Matrix mit zufallszahlen im bereich [0,1]

Edit (Leonidas): Code-Highlighting eingeschaltet.
BlackJack

Beitragvon BlackJack » Samstag 24. März 2007, 21:29

Zahlen zwischen -1 und 1 bekommst Du so:

Code: Alles auswählen

In [20]: numpy.random.rand(10) * 2 - 1
Out[20]:
array([-0.15433596, -0.41357483,  0.81264169,  0.65605305,  0.15416102,
       -0.65372808, -0.38509247,  0.40473533,  0.91312001,  0.63584674])
OTB
User
Beiträge: 15
Registriert: Samstag 24. März 2007, 17:54

Beitragvon OTB » Samstag 24. März 2007, 22:02

@BlackJack
super, danke

habe die lösung zur ersten frage eben durch "frickeln" selbst herausfinden können.

Code: Alles auswählen

array_V_out = numpy.array(V>0,dtype=int) # oder dtype=float

ersetzt die funktion fire(V,y=0) vollständig,
wenn array_V_out aus nullen und einsen bestehen soll.
wenn array_V_out z.B aus den zahlen -1 und 1 bestehen soll,
ist noch eine umwandlung durchzuführen.
array_V_out = ((array_V_out * 2)-1)


P.S: im vergleich mit listen sind numpy-arrays bei
rechnungen mit grossen zahlenmengen sehr performant
(bei einem kleinen test ergab sich 20-fache geschwindigkeit)
habt ihr da vergleichbare erfahrungen machen können?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 24. März 2007, 22:59

OTB hat geschrieben:P.S: im vergleich mit listen sind numpy-arrays bei
rechnungen mit grossen zahlenmengen sehr performant

Ob das wohl damit zusammenhängt, dass diese Lib extra für sowas optimiert wurde... 8)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Montag 26. März 2007, 07:49

Hoi,

wie schon auf der numarray-Homepage vermerkt:
Note: numarray will be phased out and replaced by numpy.

Seid dem letzten Jahr gibt es numpy und dieses soll die getrennten Entwicklungslinien von numarray und Numeric wieder zusammenführen. (Siehe auch andere Posts zum Thema in diesem Forum.)
Wenn die Performance von numpy zu wünschen übrig läßt: Mail mit Beispiel an die Mailingliste und wahrscheinlich ist das Problem innerhalb weniger Tage gelöst und in svn.

Ansonsten ist folgendes Beispiel keine Lösung für Dein Problem in numpy, sollte Dich aber auf die richtige Spur bringen:

Code: Alles auswählen

>>> from numpy import random, where
>>> a
array([ 0.86577478,  0.48539197,  0.69748524,  0.66465944,  0.51483461,
        0.0676153 ,  0.43318625,  0.59504018,  0.89933441,  0.06827312])
>>> b = where(a>0.5, 1, -1)
>>> b
array([ 1, -1,  1,  1,  1, -1, -1,  1,  1, -1])

Wollte ich noch nachschieben ...

Gruß,
Christian

PS Mach mal dir(numpy.random), um mehr über Funktionen zu Zufallszahlen zu erfahren.
OTB
User
Beiträge: 15
Registriert: Samstag 24. März 2007, 17:54

Beitragvon OTB » Montag 26. März 2007, 16:24

Wenn die Performance von numpy zu wünschen übrig läßt...


Nein, ganz im Gegenteil, numpy geht ab wie Schmidt's Katze. :)
Bei meinen kleinen Tests (Rechnungen mit grossen Vektoren/Matrizen)
ergab sich, das numpy viel schneller hoppelt als Numeric,
und ein kleines bischen flinker ist als numarray.


b = where(a>0.5, 1, -1)


Genau das habe ich gesucht!
(sieht besser aus als meine Frickel-Lösung)

Danke für Eure Hilfe!
So geht es Schritt für Schritt vorwärts...


P.S:
Ich beschäftige mich zur Zeit mit KNN's
(Künstlichen Neuronalen Netzwerken)
Speziell mit der Programmierung eines MLP (Multi Layer Perceptron)
Die Verwendung von arrays beschleunigt (bei grossen Netzwerken)
die Verarbeitungsgeschwindigkeit um ein vielfaches, und
die Anzahl der Programmzeilen reduziert sich erheblich.
Python gefällt mir immer besser :)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Montag 26. März 2007, 16:36

OTB hat geschrieben:
Wenn die Performance von numpy zu wünschen übrig läßt...


Nein, ganz im Gegenteil, numpy geht ab wie Schmidt's Katze. :)
Bei meinen kleinen Tests (Rechnungen mit grossen Vektoren/Matrizen)
ergab sich, das numpy viel schneller hoppelt als Numeric,
und ein kleines bischen flinker ist als numarray.

Das schon. numpy ist inzwischen ziemlich ausgereift. Aber manchmal gibt es noch Probleme und für den Fall ist mein Rat halt: Nicht verzagen, Mailingliste fragen! Da gibt es viel mehr Kompetenz, als hier im Forum (mich und BlackJack (sorry, BJ) eingeschlossen).

Zu Deinem Fach: Ich weiß nichts darüber, erinnere mich aber auf der scipy-Mailingliste entsprechende Posts gesehen zu haben. Vielleicht hilft kreatives googeln oder fragen auf der Mailingliste, damit Du in Erfahrung bringen kannst, was diesbezüglich in Python aktuell ist.

Gruß & viel Spaß noch im Forum,
Christian

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]