python@与@=的用法
最近在阅读一篇paper给出的代码时遇到了这样一行
h_ij0 = z_ij @ rel_var
这让我很费解,因为之前从来就没有遇到过@
作为运算符进行二元运算的情况。之前遇到的@
都是作为装饰器的标志符号(有关python装饰器的讲解已经烂大街了,有兴趣的可以直接去搜索),今天我们就来探究一下python中@
作为二元运算符的作用。
当然,直接搜百度,搜bing甚至搜StackOverflow都没有找到想要的答案,全是一堆讲python装饰器的。我甚至开始怀疑paper贴的代码是错的,但是它的确可以运行。当我查阅python的官方文档时,我找到了一些线索:
从上图我们可以看出,python官方文档将@
运算符分为了Operators
和Delimiters
说明@
确实可以参与二元运算的,于是我回到paper给的代码中去,分别查看参与运算的两个参数类型和shape
,输出如下:
z_ij: torch.Size([200, 2])
rel_var: torch.Size([2, 300])
h_ij0: torch.Size([200,300])
看到这里大家应该能猜出来了,@
执行的是矩阵乘法,让我们来做个实验。
import numpy as np
a = np.ones((2, 3))
b = np.ones((3, 2))
print(a @ b)
# 输出 [[3. 3.]
# [3. 3.]]
说明我们猜想正确,以上。