python anfänger problem

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
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

Liebe Leute
ich versuche schon seit tagen eine Vektor-matrix-produkt Funktion zu programmieren. allerdings ohne numpy!

ich habe bereits eine Funktion programmiert die jeden Eintrag eines Vektors oder einer Matrix negiert, dh jeden eintrag des Vektors/der Matrix mit -1 multipliziert

ich habe es geschafft ein vektorprodukt (Vektor mal Vektor) zu programmieren.

bei einem Vektor-Matrix-Produkt muss ich jedoch einen Vektor(liste) mit einer matrix(liste in liste) rechnen und weiss nicht wie ich das programmiere?

Bei einem Vektor - Matrix - Produkt sollte dann bei meinen gegebenen Vektor und Matrix am Ende [18, 18] rauskommen

Könntet ihr mein Programm anschauen und mir sagen ob ich es soweit gut gelöst habe und wie ich das Vektor-Matrixprodukt programmiere?
mein Programm sieht soweit so aus:

Code: Alles auswählen

vec = [2,2,2]
vecc = [3,3,3]
matrix = [[3,3,3],[3,3,3]]

#Funktion die Einträge mit -1 multipliziert
def negiere(liste):
    jj = [x * -1 for x in liste]
    
    if type(liste[0]) == list:
        jj = [[x*-1 for x in item] for item in liste]
    return jj


#print negiere(matrix)
#print negiere(vec)
#print product(vec, vecc)

#Hier ist die Produktfunktion:
def product(a,b):
    jj = sum(a[x]*b[x] for x in range(len(b))) #Vektorprodukt
    
    if type(a[0]) or type(b[0]) == list: 
    
    # hier sollte dann das matrix produkt sein
        
        
    return jj
wäre wirklich cool wenn mir wer helfen könnte! es ist ja nur eine Zeile code!
mein problem ist also: wie mache ich ein SkalarProdukt zwischen Liste UND Liste in Liste ?
Zuletzt geändert von Anonymous am Montag 6. April 2015, 13:05, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@jjonson123: ich wußte gar nicht, dass man Listen auch mit negativen Zahlen "multiplizieren" kann. Aber etwas zu machen, was man danach gleich wieder wegwirft, ist doch unsinnig. Ob ein Objekt von einem bestimmten Typ ist, macht man mit "isinstance". Das könnte dann z.B. so aussehen:

Code: Alles auswählen

def negiere(liste):
    if isinstance(liste[0], list):
        return [negiere(item) for item in liste]
    return [-x for x in liste]
In "product" gilt das selbe, erst testen, dann rechnen. Wobei der Test falsch ist, da "type(a[0])" immer True liefert. Wie würdest Du denn ein Matrix-Produkt mit Bleistift und Papier berechnen?
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

@Sirius3

Danke für den Tipp mit isinstance!

Aber bei manchen Situationen kommt man auch mit einem if aus, wie in meiner Funktion
denn meine negiere funktion macht eigentlich das selbe wie deine funktion nur dass ich halt 'if" verwende... oder?

Code: Alles auswählen

if type(vector) == int:
    print " Typ int " #mach das
if type(vector) == list:
    print "Typ liste" #mach das
außerdem verstehe ich nicht was du mit dem wegwerfen meinst? was werfe ich weg?

stimmt! das mit a[0] ist immer True? hier wird isinstance benötigt!
verstehe aber nicht wieso klappt das hier nicht mit if?

Code: Alles auswählen

if type(vec[0]) or type(vecc[0]) is not int:
    print"hallo"#mach das
ich hab die Lösung für die Überprüfung dank deines tipps mit isinstance gelöst:

Code: Alles auswählen

if isinstance(v1[0], list) or isinstance(v2[0], list):
    print "Einer der beiden enthaltet eine liste"
Matrix-Vektor-Produkt würd ich so machen:

Vektor[2,2,2]

Matrix[(3,3,3) , (3,3,3) ]

Produkt = (2*3 + 2*3 + 2*3) , (2*3 + 2*3 + 2*3) = (18, 18)

also eigentlich nur wieder ein vektorprodukt (was ich schon programmiert habe siehe oben)
bei einem vektorprodukt also Vektor(liste) mal Vektor(liste) das ist ja mithilfe der sum() Funktion zu lösen.. hab ich geschafft
nur wenn ich Vektor - Matrix -Produkt mache muss ich ja mit den Vektor(liste) mit Matrix(Liste von Listen) irgendwie arbeiten und ich komm nicht drauf wie ich das programmieren soll?

also wie müsste ich das Programm erweitern ? oder sollte ich die Funktion überhaupt ganz anders programmieren? also Vektorprodukt stimmt mal...

Code: Alles auswählen

"""
Diese Funktion soll das Skalarprodukt von A und B ausgeben, falls A und B Vektoren passender Dimension sind sowie
das Vektor-Matrixprodukt von A und B ausgeben, falls A eine Matrix und B ein Vektor passender Dimension sind
"""

def product(a,b):
    jj = sum(a[x]*b[x] for x in range(len(b))) #Vektorprodukt
    
    if isinstance(a[0], list) or isinstance(b[0], list): #überprüft ob einer der beiden eine liste enthaltet 
    
    #Anweisung matrixprodukt jj = ?
    
    return jj
btw wie werden die Zeilen bei deinen geposteten codes angezeigt? und bei mir nicht?
Zuletzt geändert von Anonymous am Montag 6. April 2015, 13:10, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@jjonson123: was enthält jj bei Deinem negiere wenn Du eine Matrix als Argument übergibst und was machst Du mit diesem jj?
Ich benutzte genauso if wie Du nur dass Deine Bedingung eine andere ist, und isinstance der Prüfung per type vorzuziehen ist, weil man damit auch mit abgeleitete Listen arbeiten kann. Schau Dir nochmal an was "or" macht.
Meine Lösung für negiere funktioniert im wesentlichen auch für product, spalte die Matrix in Vektoren und wende die Lösung für Vektoren darauf an.
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

deine negiere Funktion ist wirklich gut!
danke für die Hilfe!

aber irgendwie komme ich dadurch nicht auf die lösung für die product-funktion?

ich habe nämlich jetzt 2 Parameter! wie komme ich auf die einzelnen zahlen der matrix? und gleichzeitig auf die einzelnen zahlen des Vektors?

Also nochmal die Funktion soll:
- das Skalarprodukt von A und B ausgeben, falls A und B Vektoren passender Dimension sind sowie

- das Vektor-Matrixprodukt von A und B ausgeben, falls A eine Matrix und B ein Vektor passender Dimension sind

was meinst du mit spalte die matrix in Vektoren???

ich habe es so probiert

Code: Alles auswählen

def prod(a,b):
    if isinstance(a[0], list) or isinstance(b[0],list):
        return [prod(a,b) for ]    #kenne mich nicht aus :/
    return sum(a[x]*b[x] for x in range(len(b)))
programmieren ist nicht leicht für Anfänger :/


Also zurück zu meiner negiere Funktion:
bei mir ist jj die neue (negierte)liste

es gibt 2 fälle: Vektor ODER Matrix

und if type == list
dann ist es eine matrix und ein anderes jj

und am ende wird das jj returned
das war halt so meine Idee irgendwie.. naja anscheinend ist deine "programmschreibweise" besser ! :)

Danke für die Hilfe
Zuletzt geändert von Anonymous am Montag 6. April 2015, 13:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@jjonson123: Du mischt ja gerade zwei Fälle, wobei es ja prinzipiell vier Fälle gäbe: A Matrix, B Vektor oder A Vektor, B Matrix oder beides Matrizen oder beides Vektoren. Ob die Dimensionen passen prüfst Du im Moment noch gar nicht.
Bei "for item in liste" ist doch jedes item dann ein Vektor, oder nicht?
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

die 2 Fälle sind bei negiere Funktion

ich kann ja nur entweder eine matrix oder einen Vektor negieren
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

ich möchte ja eben eine NEUE Funktion schreiben
mit 2 parametern
und ja 4 fällen und die überprüfung der Dimensionen

die Funktion soll ein Skalarprodukt durchführen können
und ein Vektor-Matrixprodukt durchführen können wenn die Dimensionen passen

bin verwirrt :/

die NEGIERE FUNKTION PASST EH !

was ich nur nicht verstehe ist das:

negiere(vector)
print vector

warum ist der ausgegebene vector nicht negiert? ich müsste " print negiere(vector)" schreiben damit der negierte vector rauskommt
warum speichert er es nicht obwohl es bereits negiert wurde?
BlackJack

@jjonson123: Der *neu erstellte* negierte Vektor wird nicht gespeichert weil *Du* ihn nicht an einen Namen bindest. Oder halt direkt ausgibst.
BlackJack

@jjonson123: Wenn Du eine Funktion schreiben möchtest die je nach ”aussehen” der Argumente etwas total unterschiedliches macht, dann würde ich die verschiedenen Fälle an Deiner Stelle erst einmal als einzelne Funktionen entwickeln (und testen) und *dann* erst eine Funktion schreiben, die sich die beiden Argumente anschaut und daraufhin entscheidet welche spezialisiertere Funktion dafür aufgerufen werden muss. Das ist für den Anfang sicher einfacher als gleich alles auf einmal in einer Funktion zu implementieren.
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

Danke für den Tipp! werd ich in Zukunft beachten.
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

ist meine Funktion für ein Vektorprodukt gut so?
oder sollte ich das anders machen?

Code: Alles auswählen

vector = [2,2,2]
vector2 =[3,3,3]


def vektorprod(v1,v2):
    return sum([v1[i]*v2[i] for i in range(len(v1))])

print vektorprod(vector,vector2)
BlackJack

@jjonson123: Die `zip()`-Funktion hatten wir doch schon. Und die eckigen Klammern um das Argument für `sum()` sind überflüssig weil die Funktion nur etwas iterierbares haben möchte und da auch ein Generatorausdruck geht.
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

danke dass ihr mir versucht zu helfen...
ich denke ich bin schon ziemlich nah dran die lösung zu finden. für mich als Anfänger ist es schwer die richtigen Techniken zu finden und anzuwenden.

also wenn ich ´print sum(x*element[0] for x,element in zip(v1,matrix))´ verwende kriege ich das skalarprodukt von [2,2,2] mit dem ersten index von matrix [3,3,3] also = 18

aber bei einem Vektor-matrixprodukt sollte ja eine neue Liste rauskommen also Ergebnis = [18,18,18]

muss ich eine neue liste als `Ergebnis` definieren und dann mit `append` diese "18" index für index hinzufügen?

wie sage ich im programm dass ich eben nicht nur den ersten index (element[0]) in der matrix mit x multiplizieren will sondern eben jeden index..

ich weiss .. irgendwie mit einer `for` schleife!

aber wenn ich eingebe:

print sum(x*element for x,element in zip(v1,matrix) for i in range(len(element)))

bekomme ich die gesamtsumme.. also 54 (18+18+18)

vielleicht könnt ihr mir wieder paar tipps geben ;) ich stecke grad fest

Code: Alles auswählen

v1 = [2,2,2]

matrix = [[3,3,3],[3,3,3],[3,3,3]]

print sum(x*element[0] for x,element in zip(v1,matrix))

print sum(x*element[i] for x,element in zip(v1,matrix) for i in range(len(element)))
Zuletzt geändert von Anonymous am Dienstag 7. April 2015, 14:34, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@jjonson123: wenn Du die for-Schleife innerhalb der Summe hast, wird natürlich die Summe über alles gebildet. Du mußt also die Schleife aus der Summe ausnehmen und statt dessen eine Liste erzeugen.
jjonson123
User
Beiträge: 11
Registriert: Sonntag 5. April 2015, 18:43

ich habe die funktion fast geschafft. ich muss noch das mit den passenden Dimensionen hinkriegen.

ich hab ne frage:
wieso brauchen die beiden listen ( ` v1, matrix[0] ` )die gleichen längen?
warum kommt beim ersten index von matrix * 3 nicht 24, sondern 18 raus? ich müsste die liste v1 mit einem index mit dem Wert 2 erweitern damit die listen die gleiche länge haben damit 24 rauskommt? hmm

Code: Alles auswählen

v1 = [2,2,2]
matrix = [[3,3,3,3],[2,2,2],[5,5,5]]

print sum(m*v for m,v in zip(v1,matrix[0]))
print zip(v1,matrix[0])
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

jjonson123 hat geschrieben:wieso brauchen die beiden listen ( ` v1, matrix[0] ` )die gleichen längen?
Weil es mathematisch sonst keinen Sinn ergibt?! Wenn du eine Matrix M mit einem nx1-Vektor multiplizieren willst, dann muss die Matrix die Form mxn haben. Wie willst du denn sonst jede Zeile des Vektors mit jeder Spalte der Matrix multiplizieren? ;-)
jjonson123 hat geschrieben:warum kommt beim ersten index von matrix * 3 nicht 24, sondern 18 raus? ich müsste die liste v1 mit einem index mit dem Wert 2 erweitern damit die listen die gleiche länge haben damit 24 rauskommt? hmm
Das könnte man natürlich tun, aber das wäre reichlich sinnlos. Was soll denn deiner Meinung nach eine Matrix sein, welche verschiedene Zeilenlängen hat. Das ergibt doch gar keinen Sinn. Ich habe das Gefühl, dass nicht die Umsetzung das Problem ist, sondern das Verständnis der Matrixmultiplikation. Nimm dir doch mal ein Blatt Papier, einen Stift und multipliziere mal von Hand. Dann wirst du auch ganz schnell feststellen, dass sich dein Problem in einfache Teilprobleme zerlegen lässt.
Das Leben ist wie ein Tennisball.
Antworten