2013-07-12 2 views
1

이 클래스는 초보자가하는 질문이라고 생각합니다.하지만 클래스 메소드를 사용하는 상황이 나타날 때 사용하는 파이썬 접근법에 대해 궁금합니다. 클래스뿐만 아니라 모듈 자체 내에서 정의 된 메소드를 포함합니다. 나는 numpy를 예제로 사용할 것이다. 내가 NumPy와 정의 foo는 방법과 방법을 전화 드렸습니다 곳클래스와 모듈 메소드의 파이썬 사용

import numpy as np 

foo = np.matrix([[3, 4], [9, 12]]) 

# Get norm (without using linalg) 
norm = np.sqrt(foo.dot(foo.T)).diagonal() 

나는이 같은 혼합 케이스를 사용하거나, 나는 다음과 같이 코드를 작성할 수 있습니다

norm = np.diagonal(np.sqrt(np.dot(foo, foo.T))) 

내가 선호 foo.bar.baz.shoop.doop 구문을 사용하고 있지만, sqrt는 foo의 메소드가 아니기 때문에이 경우에는 할 수 없습니다. 그럼,이 같은 선을 쓰는 더 평범한 방법은 무엇입니까?

덧붙여 말하자면, 부차적 인 질문으로, 모듈에서 정의 된 메소드에 비해 일반적으로 클래스 메소드가 더 최적화 되었습니까? 나는 두포에서 무슨 일이 일어나고 있는지 잘 이해하지 못한다. 그러나 numpy는 배열이나 행렬이 될 수있는 일반적인 경우를 위해 작성된 np.dot 메서드를 가지고 있다고 가정했다. np.matrix.dot는 행렬 연산에만 다시 구현되고 최적화됩니다. 내가 틀렸다면 나를 바로 잡으세요.

답변

1

당신이 묻는 질문은 실제로 존재하지 않기 때문에 당신이 묻는 질문에는 실제로 대답이 없습니다.

일반적으로 파이썬에서는 메소드 및 전역 함수와 동일한 기능을 사용할 수 없습니다.

NumPy는 특별한 경우입니다. 일부는 아니지만 모든 최상위 함수가 적절한 객체의 메소드로 사용할 수 있기 때문에 NumPy는 특별한 경우입니다. 그렇다하더라도, 그들은 종종 동일한 의미론을 갖지 않으므로, 그 대답은 스타일에 대한 질문이 아니라 올바른 기능입니다.

예를 들어 귀하가 선택한 경우에만 선택할 수있는 사람은 diagonal입니다. 두 옵션은 다른 결과를 제공합니다.

>>> m = matrix([[1,2,3], [4,5,6], [7,8,9]] 
>>> np.diagonal(m) 
array([1, 5, 9]) 
>>> m.diagonal() 
matrix([[1, 5, 9]]) 

모듈 함수 (N)를 형상의 2 차원 배열 (N, N)를 소요 형상의 1 차원 배열을 반환한다. 이 방법은 모양의 2D 매트릭스 (N, N)를 취해 모양 (1, N)의 2D 매트릭스를 반환합니다.

matrix 방법이 더 빠를 수도 있습니다. 그러나 그 중 하나가 옳다면 다른 하나가 잘못되었다는 사실만큼 중요하지 않습니다. + 또는 *이 두 개의 숫자를 더 빠르게 곱하는 것과 같은 것입니다. +*보다 빠르 든 빠르든지간에 곱할 수 없으므로 곱하기가 더 빠릅니다.

+0

아, 나는 다른 반환 유형을 알아 채지 못했습니다. 사실,이 특별한 예와 테아 노 (Theano)의 유사한 예는 제가 실행 한 유일한 예에 관한 것입니다. 이것이 일반적인 문제가 아니라는 것을 아는 것이 좋습니다. 첫 번째 예제에서와 같이 혼합 서식을 사용해야합니다. 내 괄호를 추적하지 않고 읽는 것이 조금 더 어려워 보이지만 적절한 설명을 통해이를 수정할 수 있습니다. 답변 해주셔서 감사합니다. 편집 : 투표 할 평판이 충분하지 않습니다. ( –

+0

@Phox : 중간 변수 ('selfdot = np.dot (foo, foo.T)')를 사용하여 여러 문장을 사용하여 대괄호 문제를 해결할 수 있다는 것을 기억하십시오. norm = np.diagonal (np.sqrt (selfdot))'), 복잡한 표현을 함수로 변환 ('norm = diagnorm (foo)') 할 수 있습니다. – abarnert