2017-01-31 2 views
2

선형 방정식 Ax = b를 풀고 싶다. 각 A는 3D 행렬에 들어있다. - 예를 들어, 도끼 = B에서 Numpy가 루프없이 3D 선형 방정식을 풀다.

가 가정하자 A.shape가 (2,3,3)

즉 = [[[1,2,3], [1,2,3], [1,2,3]] [1,2,3], [1,2,3], [1,2,3]]

및 B.shape가 (3,1) 즉 [1,2,3]^T

Ax : = B ie (x_1, x_2, x_3)의 x을 알고 싶습니다.

마음에 떠오르는 점은 np.ones (2,3)로 B를 곱하고 각 A 요소의 역함수와 함께 함수 점을 사용하는 것입니다. (예 : A [:] [:] = [1,2,3]) 어떻게 Ax = B 방정식을 풀 수 있습니까? 루프없이?

  • 나는 A와 B의 원소를 동일하게 만들었지 만 여러분이 아시다시피, 그것은 단지 예일뿐입니다. 가역 행렬 용

답변

1

우리는 3D 배열 Anp.linalg.inv를 사용하여, 우리는 각각 두 배열의 마지막과 처음 축의 상실과 같이되도록 다음 B와 텐서 매트릭스 승산을 사용할 수 -

np.tensordot(np.linalg.inv(A), B, axes=((-1),(0))) 

샘플 런 - 대안

In [150]: A 
Out[150]: 
array([[[ 0.70454189, 0.17544101, 0.24642533], 
     [ 0.66660371, 0.54608536, 0.37250876], 
     [ 0.18187631, 0.91397945, 0.55685133]], 

     [[ 0.81022308, 0.07672197, 0.7427768 ], 
     [ 0.08990586, 0.93887203, 0.01665071], 
     [ 0.55230314, 0.54835133, 0.30756205]]]) 

In [151]: B = np.array([[1],[2],[3]]) 

In [152]: np.linalg.solve(A[0], B) 
Out[152]: 
array([[ 0.23594665], 
     [ 2.07332454], 
     [ 1.90735086]]) 

In [153]: np.linalg.solve(A[1], B) 
Out[153]: 
array([[ 8.43831557], 
     [ 1.46421396], 
     [-8.00947932]]) 

In [154]: np.tensordot(np.linalg.inv(A), B, axes=((-1),(0))) 
Out[154]: 
array([[[ 0.23594665], 
     [ 2.07332454], 
     [ 1.90735086]], 

     [[ 8.43831557], 
     [ 1.46421396], 
     [-8.00947932]]]) 

는 텐서 행렬 곱셈의해 대체 될 수있다,과 같이 - 파이썬 3.x를에

np.matmul(np.linalg.inv(A), B) 

, 우리는 같은 기능을 @ operator을 사용할 수 있습니다 -

np.linalg.inv(A) @ B 
+0

은 무엇 4D 매트릭스하면 어떻게됩니까? 이것은 동일한 절차가 있습니까? –

+0

@ 구 마왕 예, 변경하지 않아도됩니다. – Divakar

+0

텐서 점에서 음수 값 '-1'은 무엇입니까? 나는 '1'이어야한다고 생각합니다. –

관련 문제