Seite 1 von 1

Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 10:46
von 01detlef
Hallo,

ich bräuchte mal wieder einen Tipp und zwar habe ich drei Arrays:

Code: Alles auswählen

     for j in range(2):
       if j==0:
         mod1 = np.array(map(float,mod[:,1]))*7
       if j==1:
         mod2 = np.array(map(float,mod[:,2]))*3
       if j==2:
         mod3 = np.array(map(float,mod[:,3]))*4
Bisher:
x=[1 2 3...]
y=[1 2 3..]
z=..
Das sind die Arrays und daraus soll ein Array in dem x,y,z spaltenweise vorkommen, also:
x y z
1 1 1
2 2 2
3 3 3
usw

detlef

Re: Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 12:13
von BlackJack
@01detlef: Erstmal hast Du da keine drei Arrays sondern nur zwei. Der ``if j == 2:``-Zweig wird niemals ausgeführt weil `j` nur die Werte 0 und 1 annimmt.

Und dann geht da sehr viel am Sinn von `numpy`-Arrays vorbei. Du willst in der Regel kein kein `__builtin__.map()` auf ein `numpy`-Array ausführen. Da wird aus einem Array eine Liste erstellt um daraus dann wieder ein Array zu erstellen. Das ist ein unnötiger und ineffizient Zwischenschritt. Das Teilen in drei Arrays um sie danach wieder zusammen zu fügen ist ebenfalls ungünstig und unnötig.

Ich gehe mal davon aus, dass die Elemente von `mod` bereits Zahlen im weitesten Sinne sind. Sollte das nicht der Fall sein, müsste man sich mal anschauen wie `mod` erstellt wurde.

Dann willst Du die Spalten 2 bis 4 heraus „slicen” und mit einem Array mit den Faktoren für die Spalten multiplizieren.

Code: Alles auswählen

In [61]: mod
Out[61]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

In [62]: mod[:,1:4]
Out[62]: 
array([[ 1,  2,  3],
       [ 6,  7,  8],
       [11, 12, 13],
       [16, 17, 18],
       [21, 22, 23]])

In [63]: mod[:,1:4] * np.array([7.0, 3.0, 4.0])
Out[63]: 
array([[   7.,    6.,   12.],
       [  42.,   21.,   32.],
       [  77.,   36.,   52.],
       [ 112.,   51.,   72.],
       [ 147.,   66.,   92.]])

Re: Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 14:27
von 01detlef
Hallo,

okay, dann nochmal von vorne. Ich lese ein Array ein und möchte die erste Spalte komplett mit einem Faktor x multiplizieren, die zweite Spalte mit Faktor y und dritte Spalte mit Faktor z. Wie kann man das am sinnvollsten machen? Ich habe das so wie oben gemacht, erscheint mir auch auch sehr umständlich.

Nachdem die Multiplikation der Spalten durchgeführt wurde, soll eine andere Matrix addiert werden, also die erste Spalte Matrix A plus erste Spalte Matrix B (also die Einträge jeweils addieren) und das gleiche für Spalte zwei und drei.

detlef

Re: Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 14:38
von Sirius3
Hallo Detlef,

was bitte schön soll an

Code: Alles auswählen

mod2=mod*[7,3,4] + andere_matrix
umständlich sein?

Grüße
Sirius

Re: Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 16:18
von BlackJack
@01detlef: Würde ich auch gerne wissen was mit umständlich genau gemeint ist?

Und nur zur Sicherheit: Enthält `mod` überhaupt mehr als drei Spalten? Wenn nicht kann man sich das „slicen” natürlich sparen und dann ist Dein anfangs gezeigter Quelltext fehlerhaft.

Re: Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 17:00
von 01detlef
Ja, es sind vier Spalten! Wieso ist das fehlerhaft?

detlef

Re: Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 17:01
von 01detlef
Naja, ich finde es umständlich, dass ich eine Schleife verwende und dann das Umwandeln von Listen in Arrays usw.

detlef

Re: Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 17:54
von BlackJack
@detlef: Sowohl Sirius3 als auch ich gingen bei „so wie oben” von meinem Code aus und nicht von Deinem. Sorry.

Re: Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 18:24
von 01detlef
ok, sorry! Mein Code läuft und dann lasse ich das erstmal so. Nun habe ich noch eine weitere Frage zu einem Array. Ich habe das Array mit x,y,z als Spalten im Array und insgesamt 130 Koordinaten. Nun lasse ich mir mit

[code_python]
ma_x = max(x for x,y,z in coord)
ma_y = max(y for x,y,z in coord)
ma_z = max(z for x,y,z in coord)
[/code]

die Maximalwerte ausgeben. Wie bekomme ich aber die zugehörigen yz, xz und xy, wenn ich ein Maximum in den jeweiligen Spalten gefunden habe?

detlef

Re: Arrays zusammenfügen

Verfasst: Freitag 2. November 2012, 19:29
von BlackJack
@01detlef: Ich begreife es nicht; warum weigerst Du Dich so beharrlich `numpy` so zu verwenden wie es gedacht ist? Wie Dein Code einfacher geht haben wir Dir doch gezeigt. Sogar mit Beispielen der Teilergebnisse, damit Du das besser nachvollziehen kannst. Und damit Du auch siehst wie man selber solche Ausdrücke interaktiv entwickeln und testen kann.

Mit der `max()`-Funktion und dem Generatorausdruck machst Du schon wieder das selbe — Python-Grundfunktionen verwenden, statt der effizienteren `numpy`-Methoden. Die Maximalwerte für die Spalten kann man so ermitteln:

Code: Alles auswählen

x_max, y_max, z_max = coords.max(0)
Die Frage nach den zugehörigen Werten ist nicht wirklich eindeutig. Getrennt? Gemeinsam? Alle Werte für den jeweiligen Maximalwert oder nur einen? Wenn nur einen, irgendeinen bestimmten?
Falls es alle Zeilen sein sollen bei denen mindestens einer der Werte dem entsprechenden Spaltenmaximum entspricht, könnte man das zum Beispiel so formulieren:

Code: Alles auswählen

coords_max = coords[
    reduce(
        np.logical_or,
        (m == coords[:, i] for i, m in enumerate([x_max, y_max, z_max]))
    )
]
Hier ist mir auf die Schnelle kein Weg eingefallen wie man die Schleife mit `numpy`-Operationen ausdrücken kann. :-(

Re: Arrays zusammenfügen

Verfasst: Samstag 3. November 2012, 04:05
von gkuhl
@BlackJack: Eine reine NumPy Löschung wäre folgende:

Code: Alles auswählen

In [63]: mod
Out[63]: 
array([[ 1, 22,  3],
       [ 6,  7,  8],
       [22, 12, 13],
       [16, 17, 18],
       [21, 22, 23]])

In [64]: mask = any(mod == repeat([mod.max(0)], mod.shape[0], axis=0), axis=1)

In [65]: mask
Out[65]: array([ True, False,  True, False,  True], dtype=bool)

In [66]: mod[mask]
Out[66]: 
array([[ 1, 22,  3],
       [22, 12, 13],
       [21, 22, 23]])
Grüße
Gerrit

Re: Arrays zusammenfügen

Verfasst: Samstag 3. November 2012, 07:33
von BlackJack
@gkuhl: Ah, danke. :-)

Böser Sternchenimport übrigens. :-P Es ist *nicht* das eingebaute `any()` — was jetzt verdeckt ist — und nicht `itertools.repeat()`.

Re: Arrays zusammenfügen

Verfasst: Samstag 3. November 2012, 09:53
von 01detlef
Also ich möchte in einer Spalte den max. Wert suchen und dann die zugehörigen anderen Koordinaten haben. ALso max. x-Wert suchen und dann den y und z-Wert von dem max. x-Wert ausgeben als Vektor!

detlef

Re: Arrays zusammenfügen

Verfasst: Samstag 3. November 2012, 10:20
von BlackJack
@01detlef: Alle `y`- und `z`-Werte zum `x_max` oder nur ein (y, z)-Paar, und wenn ja welches?

Re: Arrays zusammenfügen

Verfasst: Samstag 3. November 2012, 10:44
von 01detlef
Ich weiss nicht genau was du meinst. Also Matrix
x y z
1 2 1
2 1 2
5 2 1
5 3 2

Nun soll nach max. x gesucht werden und für diesen Punkt dann x,y,z ausgeben, also 5 2 1. Was passiert aber wenn es mehrere mit 5 als x-wert gibt? Eigentlich egal, oder dann soll von den mit x=5 der max. y oder z genommen werden.

detlef

Re: Arrays zusammenfügen

Verfasst: Samstag 3. November 2012, 10:45
von 01detlef
ALs Erklärung: ich habe eine Matrix und dann sollen drei Punkte gesucht werden und mit denen soll eine Ebene aufgestellt werden. Nun müssen die Punkte irgendwie gewählt werden, damit diese nicht alle auf einer Linie oder so liegen. GIbt es da einen guten Weg die Punkte zu wählen?

detlef

Re: Arrays zusammenfügen

Verfasst: Samstag 3. November 2012, 11:06
von Sirius3
Hallo detlef,

1. die ersten drei Punkte nehmen
2. falls sie alle auf einer Geraden liegen, statt dem 3. den 4. Punkt nehmen, usw.

welche Eigenschaften soll die Ebene noch haben?
was wird danach damit gemacht?

Re: Arrays zusammenfügen

Verfasst: Sonntag 4. November 2012, 13:56
von 01detlef
hallo,

danke, dass ist eine gute Idee mit dem Prüfen, ob die Punkte auf einer Geraden liegen. Was meinst du mit Eigenschaft der Ebene?

Habt ihr auch noch eine Idee, wie man gleiche Koordinaten aus einer Matrix löschen kann? Also keine Doppeleinträge in einer Matrix erlauben?

detlef