3

파이썬 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에서? 내 머리 꼭대기에서 스칼라 연산자를 구현하지 않을 이유가 없다고 생각한다.

+0

어떨까요? [1] @ [2]'? 스칼라는 이미'*'왜 그것을 복제해야 하는가? – furas

+4

실제 문제는 코드가 때때로 스칼라를 반환하고 때로는 매트릭스를 반환한다는 것입니다. 왜 당신의 코드가 스칼라가 아닌 1 x 1 행렬을 반환하도록 리팩터링하지 않을까요? 또는 행렬 또는 스칼라를 취하고 그 행렬 또는 스칼라가있는 1x1 행렬을 반환하는 빠른 함수를 작성하십시오. –

+0

try - except 루틴을 사용할 수없는 이유는 무엇입니까? – Jalo

답변

1

제안한대로 ajcr을 사용하면 곱해질 개체에 최소한의 차원을 적용하여이 문제를 해결할 수 있습니다. 두 가지 합리적인 옵션이 있습니다. atleast_1datleast_2d@에 의해 반환되는 형식과 관련하여 스칼라 대 1x1 2D 배열을 반환합니다. 그러나

x = 3 
y = 5 
z = np.atleast_1d(x) @ np.atleast_1d(y) # returns 15 
z = np.atleast_2d(x) @ np.atleast_2d(y) # returns array([[15]]) 

:

  • X와 Y 중 어느 하나의 환경에서 발생할 것이다 그렇지 atleast_1d 사용 정상적으로 승산
  • 될 1D 어레이가있는 경우 오류가 발생할 것이다 atleast_2d 사용 스칼라 또는 행렬을 사용하면 어떤 점을 알지 못합니다.
  • 두 경우 모두 np.dot(x, y)보다 자세한 정보를 제공하므로이 모든 경우를 처리 할 수 ​​있습니다.

또한 atleast_1 버전에는 scalar @ scalar = scalar가있는 것과 동일한 결함이 있습니다. 출력으로 수행 할 수있는 작업을 알지 못합니다. z.T 또는 z.shape에 오류가 있습니까? 이것들은 1x1 행렬에 대해서는 작동하지만 스칼라에는 작동하지 않습니다. 파이썬 설정에서 스칼라와 1x1 배열의 차이점을 무시할 수는 없습니다.