python@与@=的用法

最近在阅读一篇paper给出的代码时遇到了这样一行

h_ij0 = z_ij @ rel_var

这让我很费解,因为之前从来就没有遇到过@作为运算符进行二元运算的情况。之前遇到的@都是作为装饰器的标志符号(有关python装饰器的讲解已经烂大街了,有兴趣的可以直接去搜索),今天我们就来探究一下python中@作为二元运算符的作用。

当然,直接搜百度,搜bing甚至搜StackOverflow都没有找到想要的答案,全是一堆讲python装饰器的。我甚至开始怀疑paper贴的代码是错的,但是它的确可以运行。当我查阅python的官方文档时,我找到了一些线索:

从上图我们可以看出,python官方文档将@运算符分为了OperatorsDelimiters说明@确实可以参与二元运算的,于是我回到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.]]

说明我们猜想正确,以上。

posted @ 2019-12-30 11:35  挂机的阿凯  阅读(2106)  评论(0编辑  收藏  举报