Probleme mit dem erstellen einer automatischen Matrix

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.
Antworten
paracide
User
Beiträge: 11
Registriert: Dienstag 9. August 2011, 20:55

Hi zusammen,

Ich bin neu hier und wusste deshalb nicht wo die frage wirklich hin gehört.
Aus diesem Grund im Vorfeld ein Sorry...

Nun zu meinem Problem.
Ich möchte automatisch eine Matrix (x,3) erstellen.

für den Fall das ich folgende Matrix erstellen möchte:

['1' '1' '1']
['1' '1' '2']
['1' '1' '3']
['1' '1' '4']
['1' '1' '5']
['1' '2' '1']
['1' '2' '2']
['1' '2' '3']
['1' '2' '4']
['1' '2' '5']


habe ich folgenden code:


Code: Alles auswählen

import numpy

x = 3
y = 6

Basis = str(1)
Zeile0 = numpy.array(())

for a in range(1,x):
    for i in range(1,y):
        Zeile1 = numpy.array([Basis,a,i])
        Matrix1 = numpy.concatenate((Zeile0,Zeile1))
        print (Matrix1)

Mir ist klar das ich jede Zeile der Matrix nach einander erstelle und ausgebe.
Jedoch möchte ich in der Variable Matrix1 die gesamte Matrix für Berechnungen weiter verwenden.
Wie zu sehen ist habe ich schon versucht die Zeilen aneinander zu fügen um im nachhinein über den Befehl shape die Matrix umzuformen.
Jedoch ohne erfolg

Hat einer eine Idee die mir weiterhilft, so dass ich die gewünschte Matrix automatisch generieren kann???


Danke
Zuletzt geändert von Anonymous am Dienstag 9. August 2011, 23:59, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Du darfst einfach dein Zwischenergebnis nicht immer wieder überschreiben…

Code: Alles auswählen

Matrix1 = Zeile0
for a in ...:
    for i in ...:
        Zeile1 = ...
        Matrix1 = numpy.concatenate((Matrix1,Zeile1))
print Matrix1
numpy.hstack bzw. numpy.vstack helfen dir vermutlich ein reshape zu vermeiden.
BlackJack

@paracide: Gibt es einen bestimmten Grund warum das ein `numpy.array` sein soll? Also man kann da auch Zeichenketten drin speichern, aber die sind eigentlich eher für Zahlen gedacht. Bei den gezeigten Werten für `x` und `y` ist das vielleicht nicht so wichtig, aber ein Array über wiederholtes Konkatenieren oder „Stapeln” aufzubauen, ist nicht besonders effizient. Während zum Beispiel `list` dafür ausgelegt ist dynamisch durch neue Elemente erweitert zu werden.
paracide
User
Beiträge: 11
Registriert: Dienstag 9. August 2011, 20:55

@ BlackJack

ich muss anschließend mit der Matrix rechnen und in numpy ist es so wie ich gelesen habe wesentlich einfacher.
Dort kann ich direkt Kreuzprodukt / Vektorprodukt etc ausgeben...
karolus
User
Beiträge: 140
Registriert: Samstag 22. August 2009, 22:34

Hallo

Code: Alles auswählen

s = [[1, b, c] for b in range(1,3) for c in range(1,6)]
a = numpy.array(s)
Karo
paracide
User
Beiträge: 11
Registriert: Dienstag 9. August 2011, 20:55

Ihr seid die besten!
Wie schnell das geht, danke an alle die mir so schnell geholfen haben!!!
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

@paracide: Was BJ meint ist, daß "rechnen" mit Buchstaben / Strings schlecht funktioniert. Du zeigst nämlich Buchstaben (z. B. '1') und wandelst auch in Strings um (mit str() ), was aber so ganz wie Du dachtest nicht funktioniert haben wird.

Zur Berechnung von Skalarprodukten (und ggf. auch Kreuzprodukten) (numpy.dot und numpy.cross), solltest Du aber über Matrices mit anderer Form nachdenken oder transponieren. Um in karolus Beispiel zu bleiben:

Code: Alles auswählen

In [15]: np.dot(a,a)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)

/home/cm/<ipython console> in <module>()

ValueError: objects are not aligned

In [16]: np.cross(a,a)
Out[16]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])
Aber

Code: Alles auswählen

In [17]: np.dot(a,a.T)
Out[17]: 
array([[ 3,  4,  5,  6,  7,  4,  5,  6,  7,  8],
       [ 4,  6,  8, 10, 12,  5,  7,  9, 11, 13],
       [ 5,  8, 11, 14, 17,  6,  9, 12, 15, 18],
       [ 6, 10, 14, 18, 22,  7, 11, 15, 19, 23],
       [ 7, 12, 17, 22, 27,  8, 13, 18, 23, 28],
       [ 4,  5,  6,  7,  8,  6,  7,  8,  9, 10],
       [ 5,  7,  9, 11, 13,  7,  9, 11, 13, 15],
       [ 6,  9, 12, 15, 18,  8, 11, 14, 17, 20],
       [ 7, 11, 15, 19, 23,  9, 13, 17, 21, 25],
       [ 8, 13, 18, 23, 28, 10, 15, 20, 25, 30]])
HTH
Christian
Antworten