Eu sei que @
é para decoradores, mas o que é @=
para Python? É apenas reserva para alguma idéia futura?
Esta é apenas uma das minhas muitas perguntas durante a leitura tokenizer.py
.
Eu sei que @
é para decoradores, mas o que é @=
para Python? É apenas reserva para alguma idéia futura?
Esta é apenas uma das minhas muitas perguntas durante a leitura tokenizer.py
.
Respostas:
A partir da documentação :
O
@
operador (at) deve ser usado para multiplicação de matrizes. Nenhum tipo Python embutido implementa esse operador.
O @
operador foi introduzido no Python 3.5. @=
é a multiplicação da matriz seguida pela atribuição, como seria de esperar. Eles mapeiam para __matmul__
, __rmatmul__
ou __imatmul__
similares a como +
e +=
mapeiam para __add__
, __radd__
ou __iadd__
.
O operador e a lógica por trás dele são discutidos em detalhes no PEP 465 .
@=
e @
são novos operadores introduzidos no Python 3.5 executando a multiplicação de matrizes . Eles pretendem esclarecer a confusão que existia até agora com o operador *
que foi usado para multiplicação por elementos ou por matriz, dependendo da convenção empregada nessa biblioteca / código específico. Como resultado, no futuro, o operador *
deve ser usado apenas para multiplicação por elementos.
Conforme explicado no PEP0465 , dois operadores foram introduzidos:
A @ B
, usado da mesma forma queA * B
A @= B
, usada da mesma forma queA *= B
Para destacar rapidamente a diferença, para duas matrizes:
A = [[1, 2], B = [[11, 12],
[3, 4]] [13, 14]]
A multiplicação por elementos produzirá:
A * B = [[1 * 11, 2 * 12],
[3 * 13, 4 * 14]]
A multiplicação de matrizes produzirá:
A @ B = [[1 * 11 + 2 * 13, 1 * 12 + 2 * 14],
[3 * 11 + 4 * 13, 3 * 12 + 4 * 14]]
Até agora, a Numpy usou a seguinte convenção:
o *
operador (e operadores aritméticos em geral) foram definidos como operações entre elementos em ndarrays e como multiplicação de matrizes no tipo numpy.matrix .
método / função dot
foi utilizado para multiplicar a matriz de ndarrays
A introdução do @
operador facilita a leitura do código que envolve multiplicações de matrizes. PEP0465 nos dá um exemplo:
# 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)
Claramente, a última implementação é muito mais fácil de ler e interpretar como uma equação.
@
isso foi implementado list
, o que não é o caso.
@
está associado a np.matmul
, não np.dot
. Os dois são semelhantes, mas não são os mesmos.
@ é o novo operador para Multiplicação de Matrizes adicionado no Python3.5
Referência: https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-465
Exemplo
C = A @ B