파이썬에서 '@ ='기호는 무엇입니까?


173

나는 @데코레이터를위한 것이지만 @=파이썬의 것은 무엇 입니까? 미래의 아이디어를위한 예약입니까?

이것은 읽는 동안 내 많은 질문 중 하나입니다 tokenizer.py.


1
CPython 저장소의 cset c553d8f72d65 ( GitHub 미러 ... 읽기 쉬움)를 참조하십시오 .
Nick T

SymbolHound는 문장 부호를 검색 할 수있는 검색 엔진입니다. 그러나 Python 3.5 설명서에는 '@'이 포함되어 있지만 '@ ='의 예는 포함되어 있지 않기 때문에 @ = python을 검색해도 현재 관련 결과가 반환되지 않습니다. 나는 그것을 개선하기 위해 SH에게 메시지를 보냈다. 파이썬 문서도 향상시킬 수 있습니다.
smci

1
Python 3.8 의 := 해마 연산자 와 결합 하면 @:=가시가 많은 장미 연산자 를 얻습니다 . (일본에서는 엘비스 - 바다 코끼리 연산자로 알려져있다.)
밥 스테인에게

답변:


185

에서 문서 :

@(AT) 연산자는 행렬 곱셈을 위해 사용되도록 의도된다. 내장 파이썬 타입은이 연산자를 구현하지 않습니다.

@연산자 파이썬 3.5에 도입 하였다. @=예상대로 행렬 곱셈과 대입입니다. 그들은 매핑 __matmul__, __rmatmul__또는 __imatmul__방법과 유사 ++=매핑 __add__, __radd__또는__iadd__ .

운영자와 그 근거는 PEP 465 에서 자세히 논의됩니다 .


12
그것이 왜 최신 버전의 tokenizer.py에 있지만 3.4 문서에는 없는지 설명합니다.
Octavia Togami


이것이 파이썬 데코레이터와 충돌합니까? 이것은 Python 2.n에서 구현되지 않았습니다.
frankliuao

4
데코레이터 앞에는식이 올 수 없으며 이진 연산자 앞에는 항상식이 있어야하므로 데코레이터와 충돌하지 않습니다.
rightfold

58

@=그리고 행렬 곱셈을 수행하는 @Python 3.5에 도입 된 새로운 연산자 입니다. 그것들은 지금까지 특정 라이브러리 / 코드에 사용 된 규칙에 따라 요소 별 곱셈이나 행렬 곱셈에 사용 된 연산자와 혼동을 명확히하기 위한 것입니다. 결과적으로 앞으로 연산자 는 요소 별 곱셈에만 사용됩니다.**

PEP0465에 설명 된 대로 두 개의 연산자가 도입되었습니다.

  • 새로운 이항 연산자 A @ B로 유사하게 사용,A * B
  • 다음 A @= B과 유사하게 사용되는 전체 버전A *= B

행렬 곱셈 대 요소 별 곱셈

두 행렬의 차이를 빠르게 강조하려면 :

A = [[1, 2],    B = [[11, 12],
     [3, 4]]         [13, 14]]
  • 요소 별 곱셈은 다음을 생성합니다.

    A * B = [[1 * 11,   2 * 12], 
             [3 * 13,   4 * 14]]
  • 행렬 곱셈은 다음과 같습니다.

    A @ B  =  [[1 * 11 + 2 * 13,   1 * 12 + 2 * 14],
               [3 * 11 + 4 * 13,   3 * 12 + 4 * 14]]

Numpy에서의 사용법

지금까지 Numpy는 다음 규칙을 사용했습니다.

@연산자를 도입 하면 행렬 곱셈과 관련된 코드를 훨씬 쉽게 읽을 수 있습니다. PEP0465는 우리에게 예를 제공합니다 :

# Current implementation of matrix multiplications using dot function
S = np.dot((np.dot(H, beta) - r).T,
            np.dot(inv(np.dot(np.dot(H, V), H.T)), np.dot(H, beta) - r))

# Current implementation of matrix multiplications using dot method
S = (H.dot(beta) - r).T.dot(inv(H.dot(V).dot(H.T))).dot(H.dot(beta) - r)

# Using the @ operator instead
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

분명히, 마지막 구현은 방정식으로 읽고 해석하기가 훨씬 쉽습니다.


11
명확히하기 위해 : 첫 번째 예에서에 대해 @구현 된 것으로 생각할 수 있습니다 list.
Conchylicultor

1
@와 (과) 연결 np.matmul되지 않았습니다 np.dot. 둘은 비슷하지만 동일하지 않습니다.
Acumenus

@ABB, 아마도 뉘앙스를 분명히하고 대답이 완료되도록하는 예를 제공 할 수 있습니까?
benjaminmgross

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.