Arrays zusammenfügen

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.
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Freitag 2. November 2012, 10:46

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
BlackJack

Freitag 2. November 2012, 12:13

@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.]])
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Freitag 2. November 2012, 14:27

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
Sirius3
User
Beiträge: 10882
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 2. November 2012, 14:38

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
BlackJack

Freitag 2. November 2012, 16:18

@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.
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Freitag 2. November 2012, 17:00

Ja, es sind vier Spalten! Wieso ist das fehlerhaft?

detlef
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Freitag 2. November 2012, 17:01

Naja, ich finde es umständlich, dass ich eine Schleife verwende und dann das Umwandeln von Listen in Arrays usw.

detlef
BlackJack

Freitag 2. November 2012, 17:54

@detlef: Sowohl Sirius3 als auch ich gingen bei „so wie oben” von meinem Code aus und nicht von Deinem. Sorry.
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Freitag 2. November 2012, 18:24

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
BlackJack

Freitag 2. November 2012, 19:29

@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. :-(
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Samstag 3. November 2012, 04:05

@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
BlackJack

Samstag 3. November 2012, 07:33

@gkuhl: Ah, danke. :-)

Böser Sternchenimport übrigens. :-P Es ist *nicht* das eingebaute `any()` — was jetzt verdeckt ist — und nicht `itertools.repeat()`.
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Samstag 3. November 2012, 09:53

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
BlackJack

Samstag 3. November 2012, 10:20

@01detlef: Alle `y`- und `z`-Werte zum `x_max` oder nur ein (y, z)-Paar, und wenn ja welches?
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Samstag 3. November 2012, 10:44

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
Antworten