Seite 1 von 1

Arrays - zwei kurze Fragen

Verfasst: Samstag 24. März 2007, 19:05
von OTB
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.

Verfasst: Samstag 24. März 2007, 21:29
von BlackJack
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])

Verfasst: Samstag 24. März 2007, 22:02
von OTB
@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?

Verfasst: Samstag 24. März 2007, 22:59
von Leonidas
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)

Verfasst: Montag 26. März 2007, 07:49
von CM
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.

Verfasst: Montag 26. März 2007, 16:24
von OTB
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 :)

Verfasst: Montag 26. März 2007, 16:36
von CM
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