2011-08-12 3 views
5

표준 numpy 배열과 상호 운용 될 수있는 배열과 유사한 객체를 구현하고 있습니다.왼쪽 바이너리 연산자에 대한 numpy 강제 문제

class MyArray(object): 
    def __rmul__(self, other): 
    return MyArray() # value not important for current purpose 

from numpy import array 
print array([1,2,3]) * MyArray() 

이 다음과 같은 출력 산출 : 난 그냥 다음에 좁혀 성가신 문제 명중 오히려 내가 기대했던대로 MyArray().__rmul__(array([1,2,3]))를 호출하는 것보다 분명히

[<__main__.MyArray instance at 0x91903ec> 
<__main__.MyArray instance at 0x919038c> 
<__main__.MyArray instance at 0x919042c>] 

을, __rmul__는 모든 개별 호출됩니다 배열의 요소 및 결과를 객체 배열에 래핑합니다. 이것은 파이썬의 coercion rules과 호환되지 않는 것으로 보인다. 더 중요한 것은, 그것은 내 왼쪽 곱셈이 쓸모없는 렌더링합니다.

아무도이 문제를 해결할 방법을 알고 있습니까?

답변

1

그것은 NumPy와이 문제에 대한 간단한 수정 프로그램을 제공하는 것으로 나타났다

는 (... 나는이 __coerce__를 사용하여 문제를 해결할 수 있다고 생각하지만, 링크 된 문서는 그 중 하나가 더 이상 이항 연산자에 대한 응답으로 호출 없다고 설명) . 다음 코드는 의도 한대로 작동합니다.

class MyArray(object): 
    __array_priority__ = 1. # <- fixes the problem 
    def __rmul__(self, other): 
    return MyArray() 

자세한 내용은 here입니다.