2013-01-10 2 views
3

대 파이썬에 비교적 새로운 해요 사이에 나는 그 차이가 무엇인지 궁금하네요 : 모두를 포함하는 NumPy와 배열을 반환Scipy의 INV (A) AI

inv(A) 

A.I 

행렬의 역함 .

A.I 마치 행렬의 역함수를 저장하는 행렬 클래스에서 변수에 액세스하는 것처럼 보입니다. 그러나 이것은 이 변경 될 때마다 의 역수를 다시 계산해야한다는 것을 의미합니다 (논리적이지 않습니다). 파이썬과 numpy, I (마찬가지로 T 등)의 사용자 버전에 따라

답변

5

A.Inumpy.linalg.inv은 동일하지 않습니다.

A.Imatrix.getI 호출 property이다 그래서

def getI(self): 
    M,N = self.shape 
    if M == N: 
     from numpy.dual import inv as func 
    else: 
     from numpy.dual import pinv as func 
    return asmatrix(func(self)) 

getI 어느 numpy.dual.inv (곱셈 정방 행렬의 역) 또는 numpy.dual.pinv (무어 - 펜로즈 사이비 - 역변환)의 형상에 따라 호출 매트릭스. 당신이 (dual.py에서) 정의를 통해 추적 경우

, 당신은 numpy.dual.invnumpy.linalg.invnumpy.dual.pinvnumpy.linalg.pinv 인 것을 확인할 수 있습니다. 또한

In [69]: s = np.random.random((3,4)) 

In [70]: t = np.matrix(s) 

In [71]: t.I 
Out[71]: 
matrix([[ 1.09509751, -0.56685735, 0.51704085], 
     [-1.59777153, 0.2777383 , 1.25579378], 
     [ 0.81899054, 0.7594223 , -0.82760378], 
     [ 0.02845906, 0.50418885, -0.2091376 ]]) 

In [72]: np.linalg.inv(t) 
... 
LinAlgError: Array must be square 

, np.linalg.inv을 배열 NumPy와 (과 돌려 NumPy와 배열)과 매트릭스를 적용 할 NumPy와 적용될 수있다. matrix.I 속성은 numpy 행렬에만 적용되며 다른 numpy 행렬을 반환합니다. A.I 같은

In [60]: x = np.random.random((3,3)) 

In [62]: y = np.matrix(x)  

In [64]: type(y.I) 
Out[64]: <class 'numpy.matrixlib.defmatrix.matrix'> 

In [65]: type(np.linalg.inv(x)) 
Out[65]: <type 'numpy.ndarray'> 

속성은, 문법적 특성처럼 보이지만 실제로는 (이 경우, A.getI에서) 함수를 호출합니다. 따라서 역함수의 값은 저장되지 않습니다. 파이썬이 A.I을 평가할 때마다 함수 A.getI()이 호출되고 함수의 결과가 리턴됩니다.

속성에 대한 자세한 정보는 Properties: attributes managed by get/set methods을 참조하십시오.

+1

+1 자세한 대답은 OP의 주된 관심사 인 것처럼 보였습니다. AI가 저장된 값처럼 보이더라도 액세스 할 때마다 즉시 계산됩니다. 그것. 따라서 정사각형 행렬의 경우 정확히 동일한 연산을위한 구문 식 설탕입니다. – Jaime

+1

@Jamie : 고마워, 나는 그 질문에 대해 잊어 버렸다. 나는 (희망적으로) 그것을 바로 잡기 위해 마지막에 약간을 추가했다. – unutbu

+0

감사합니다! 귀하의 답변은 매우 유용하고 간결합니다! attrubutes 및 get/set 메소드에 대해 읽어보십시오. 나는 왜 행렬의 역함수를 찾는 것이 get/set 속성을 사용하는지 이해하지 못한다. 그냥'xI()'를 만드는 것이 논리적 인 것처럼 보입니다.'xI'가보기에 더 즐겁다 고 생각되지만, 다음은 대괄호를 넣을 지 여부를 기억해야한다는 것입니다. –

2

@property, 또는 같은 일의 사용자 정의 구현 중 하나입니다.

이전에 본 적이 없다면 데이터 속성 (별칭 : "멤버 변수")처럼 보이는 것을 만들 수 있지만 액세스 할 때마다 getter 메서드를 호출한다는 아이디어가 있습니다.

따라서 A을 변경할 때마다 A.I을 다시 계산해야하는 것이 아니라 A.I에 액세스 할 때마다 다시 계산해야합니다.

물론 사용 패턴에 따라 그다지 좋지 않을 수도 있습니다. 심지어 더 나쁠 수도 있습니다. 그러나 다른 방법과 마찬가지로 numpy이 도움이된다면 메모 (메모 결과)를 중지하지 않습니다.

A.I에 대한 게터는 A.getI()이므로이 둘은 같습니다. 둘 다 아마도 inv(A)과 같습니다. (무료 함수가 foo(A)이고 동일한 방법을 사용하는 A.foo() 메서드는 모두 numpy에서 일반적입니다.) unutbu가 지적한 것 이외에는 inv이라는 메서드가 두 가지 이상 있습니다. A.I은 그 중 하나와 동일하지만 반드시 메인 네임 스페이스에 직접 가져온 것과 동일한 것은 아닙니다.