파이썬 3.5에서 행렬 곱셈에 PEP465 다음에 @
연산자가 도입되었습니다. 이것은 예 : numpy로 matmul operator. 스칼라 오퍼랜드로 호출 할 때행렬 곱셈 연산자 @ numpy의 스칼라에 대한 작업 만들기
그러나, PEP에 의해 제안 된 바와 같이, NumPy와 오퍼레이터 예외가 발생 :
>>> import numpy as np
>>> np.array([[1,2],[3,4]]) @ np.array([[1,2],[3,4]]) # works
array([[ 7, 10],
[15, 22]])
>>> 1 @ 2 # doesn't work
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unsupported operand type(s) for @: 'int' and 'int'
이 나에게 실제 분기점 인 I 수치 신호 처리 알고리즘을 구현 야하기 때문에, 그 스칼라와 행렬 모두에서 작동해야합니다. 두 경우의 방정식은 수학적으로 정확히 동일합니다. "1-D x 1-D 행렬 곱셈"은 스칼라 곱셈과 동일하기 때문에 놀랍지 않습니다. 그러나 현재 상태에서는 두 경우 모두 올바르게 처리하기 위해 중복 코드를 작성해야합니다.
따라서 현재 상태가 만족스럽지 않다면 @
연산자를 스칼라로 사용할 수있는 합리적인 방법이 있습니까? 스칼라 데이터 형식에 사용자 지정 __matmul__(self, other)
메서드를 추가하는 방법에 대해 생각했지만 관련 내부 데이터 형식의 수를 고려하면 많은 번거 로움처럼 보입니다. numpy 배열 데이터 형식이 1x1 배열 피연산자에 대한 예외를 throw하지 않도록 __matmul__
메서드를 구현할 수 있습니까?
그리고이 설계 결정의 근거가되는 sidenote에서? 내 머리 꼭대기에서 스칼라 연산자를 구현하지 않을 이유가 없다고 생각한다.
어떨까요? [1] @ [2]'? 스칼라는 이미'*'왜 그것을 복제해야 하는가? – furas
실제 문제는 코드가 때때로 스칼라를 반환하고 때로는 매트릭스를 반환한다는 것입니다. 왜 당신의 코드가 스칼라가 아닌 1 x 1 행렬을 반환하도록 리팩터링하지 않을까요? 또는 행렬 또는 스칼라를 취하고 그 행렬 또는 스칼라가있는 1x1 행렬을 반환하는 빠른 함수를 작성하십시오. –
try - except 루틴을 사용할 수없는 이유는 무엇입니까? – Jalo