2017-12-29 31 views
1

シンボリック行列の値のインデックスを探したいと思います。たとえば、私は、下のQ行列に 'Zc'シンボルを持つインデックスを探したいと思います。記号に基づいて記号行列の要素のインデックスを見つける方法は?

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])) 

予想される回答は[(0,1)、(1,0)]です。これは

(配列([0]、DTYPE = int64型)として空のセットを与え

numpy.where(A in K_P.free_symbols) 

Iはnumpy.whereと試みたが、それは空set.Thatである返さパート2: 私はSYMBの製品に基づいてインデックスを検索したい場合はQ行列は

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

ある場合すなわち、Zc*L。それではどうすればいいですか?値がZc*LL*Zcの場合はインデックスが必要です。しかし、-L*Zc*Yc/2のインデックスではありません。期待される答えは[(0,1),(1,0)]です。

答えて

1

これは実際にNumPy形式の操作ですが、特に数学的でもマトリックス的でもありません。 NumPyメソッドを使用するには、まずQをNumPy配列に変換してから、配列を検索してlambda expr: Zc in expr.free_symbolsを適用します。一緒にすべてを入れ、

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

戻り(array([0, 1]), array([1, 0]))

注意:これは、行と列の座標の組ではなく、これはタプル[行座標]は、[カラム座標]。 Zcは右下のコルネットでもあった場合たとえば、その後、idxが

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

より読みやすい形式で、あなたはおそらくたいものは、np.array(idx).Tで得られる:

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

NumPyがなければ、要素をループして見つけたものを報告するだけです。

found = [] 
for i in range(2): 
    for j in range(2): 
    if Zc in Q[i, j].free_symbols: 
     found.append([i, j]) 
print(found) 

ここでは、2つの記号の積などの式を検索するこのループの変更を示します。テストでは、その製品が0に置き換えられた場合に式が変更されるかどうかが確認されます。また、他の記号も表示されないようにしますか?それも追加されていることを確認してください。

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

ありがとうございました。私は同様の行についてさらにもう一つの質問があります。もし私がZc * Lのようなシンボルの製品に基づいてインデックスを見つける必要があれば。それではどうすればいいですか?私はこの質問をパート2として含めるように私の質問を編集し、詳細な説明は上記に与えられている。 –

+0

2番目の答えでは、 'forループ'の範囲が3の場合、すべての積記号Zc * Lのインデックスが与えられます。このコードは[[0、1]、[1、0]、[2,1]]を与えます。しかし、[2,1]要素は-L * Zc * Yc/2です。私はこれをインデックス配列に含めることは望ましくありません。私はZcとLの間の製品のインデックスのみを必要とします(L * Zc * Ycではなく)。どのように私はこれを行うことができますか? –

+0

要件はますます曖昧になりつつありますが、そのためのバージョンを追加しました。 – FTP

関連する問題