2017-12-29 46 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])) 

인 경우 ols, 즉, Zc*L. 그럼 어떻게해야합니까? 값이 Zc*L이고 L*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가 없으면 요소를 반복하고 찾은 것을보고하십시오.

다음은 두 기호의 곱과 같은 표현식을 검색하는이 루프의 수정입니다. 테스트는 해당 제품이 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

두 번째 답변에서 'for 루프'범위가 3이면 모든 제품 기호 Zc * L의 인덱스를 제공합니다. 따라서이 코드는 [[0, 1], [1, 0], [2, 1]]을 제공합니다. 그러나 [2, 1] 요소는 -L * Zc * Yc/2입니다. 이 인덱스 배열에 포함 된 싶지 않습니다. Zc와 L 사이의 제품 색인 만 원합니다 (L * Zc * Yc 아님). 내가 어떻게 할 수 있니? –

+0

요구 사항이 점점 모호 해지고 있지만 버전을 추가했습니다. – FTP