2017-12-29 39 views
1

Ich möchte den Index eines Wertes in der symbolischen Matrix finden. Zum Beispiel möchte ich den Index finden, der das 'Zc'-Symbol in der unteren Q-Matrix hat.Wie findet man den Index eines Elements in symbolischer Matrix basierend auf einem Symbol?

from sympy import symbols, Matrix 
Zc,Yc,L=symbols("Zc Yc L",real=True) 
Q=Matrix(([0,Zc,-Y],[-Zc*L,0,L/2],[Yc,-L/2,0])) 

erwartete Antwort ist [(0,1), (1,0)].

I mit numpy.where versucht, aber es ergab ein leerer set.That ist,

numpy.where(A in K_P.free_symbols) 

es als eine leere Menge gegeben, (Array ([0] = dtype int64)

Teil 2: Wenn die Q-Matrix

Q=Matrix(([0,Zc*L/6,-Yc],[-L*Zc/12,0,L/2],[Yc,-L*Zc*Yc/2,0])) 

ist, wenn ich den Index auf einem Produkt von symb Basis finden möchte B. Zc*L. Wie soll ich weitermachen? Es sollte mir Index geben, wenn der Wert Zc*L und L*Zc ist. Aber nicht der Index -L*Zc*Yc/2. Also erwartete Antwort ist [(0,1),(1,0)].

Antwort

1

Dies ist in der Tat eine NumPy-Stil-Operation, es ist nicht besonders mathematisch oder Matrix-ähnlich. Um NumPy-Methoden zu verwenden, konvertieren Sie Q zuerst in ein NumPy-Array und dann durch das Array, indem Sie lambda expr: Zc in expr.free_symbols anwenden. Putting alles zusammen,

idx = np.nonzero(np.vectorize(lambda expr: Zc in expr.free_symbols)(np.array(Q))) 

kehrt (array([0, 1]), array([1, 0]))

Achtung: dies ist kein Tupel von Zeilen-Spalten-Koordinaten, das ein Tupel [row Koordinaten], [Spaltenkoordinaten]. Zum Beispiel, wenn es auch Zc in der rechten unteren Kornett war, dann idx ist

(array([0, 1, 2]), array([1, 0, 2])) 

Ein lesbarer Form, und diejenige, die Sie wahrscheinlich wollen, erhalten mit np.array(idx).T:

array([[0, 1], 
     [1, 0], 
     [2, 2]]) 

Oder, ohne NumPy, einfach die Elemente durchlaufen und berichten, was Sie gefunden haben.

Hier ist eine Modifikation dieser Schleife, wo wir nach einem Ausdruck suchen, wie das Produkt aus zwei Symbolen. Der Test ist, ob der Ausdruck geändert wird, wenn das Produkt durch 0 ersetzt wird. Außerdem wollen Sie offensichtlich keine anderen Symbole? Überprüfen Sie, dass das auch hinzugefügt wird.

found = [] 
for i in range(3): 
    for j in range(3): 
    if Q[i, j].subs(Zc*L, 0) != Q[i, j] and Q[i, j].free_symbols == set([L, Zc]): 
     found.append([i, j]) 
print(found) 
+0

Vielen Dank für Ihre Antwort. Ich habe noch eine Frage zur ähnlichen Linie. Wenn ich den Index basierend auf einem Symbolprodukt wie Zc * L finden muss. Wie soll ich weitermachen? Ich habe meine Frage bearbeitet, um diese Frage in Teil 2 aufzunehmen, und eine detaillierte Beschreibung ist oben angegeben. –

+0

In der zweiten Antwort, die Sie angegeben haben, wenn der 'for-Schleife'-Bereich 3 ist, gibt es den Index aller Produktsymbole, Zc * L. Also gibt dieser Code, [[0, 1], [1, 0], [2, 1]]. Aber das [2, 1] -Element ist -L * Zc * Yc/2. Ich möchte nicht, dass dies in das Indexarray aufgenommen wird. Ich will nur den Index des Produkts zwischen Zc und L (nicht L * Zc * Yc). Wie kann ich das machen? –

+0

Die Anforderungen werden immer vager, aber ich habe eine Version dafür hinzugefügt. – FTP

Verwandte Themen