@= 在 Python 中是一个赋值运算符,用于将右侧的值赋给左侧的变量。

9 浏览
0 Comments

@= 在 Python 中是一个赋值运算符,用于将右侧的值赋给左侧的变量。

我知道@用于装饰器,但是在Python中@=是用来做什么的?它只是为了以后的某个想法而保留的吗?这只是我在阅读tokenizer.py时的众多问题之一。

0
0 Comments

在Python3.5中引入了一个新的运算符@,用于矩阵乘法。这个运算符的具体说明可以在Python官方文档中的PEP 465中找到。下面是一个示例代码:

C = A @ B

这个运算符的引入是为了简化矩阵乘法的操作,使得代码更加简洁和易读。使用@运算符可以直接进行矩阵乘法,而不需要使用额外的函数或方法。

如果你在Python3.5或更高版本中使用了@运算符,但是遇到了问题,可以考虑以下几个解决方法:

1. 确认Python版本:首先要确保自己使用的是Python3.5或更高版本。如果你使用的是较旧的Python版本,则无法使用@运算符。

2. 检查语法错误:如果你的代码中出现了语法错误,可能会导致@运算符无法正常工作。请仔细检查代码中的拼写错误、缩进错误等问题。

3. 检查变量类型:在进行矩阵乘法运算之前,需要确保参与运算的变量是合法的矩阵类型。如果变量不是矩阵类型,可能会导致@运算符无法正常工作。

希望以上内容对于理解@运算符的引入原因和解决相关问题有所帮助。如果你想了解更多关于@运算符的信息,可以参考Python官方文档中的相关章节。

0
0 Comments

在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使用了以下约定:

- *运算符(和一般的算术运算符)在ndarray上执行元素逐个操作,在numpy.matrix类型上执行矩阵乘法

- 使用dot方法/函数对ndarray进行矩阵乘法

引入@运算符使得涉及矩阵乘法的代码更易于阅读。PEP0465给出了一个示例:

# 使用dot函数进行矩阵乘法的当前实现
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))
# 使用dot方法进行矩阵乘法的当前实现
S = (H.dot(beta) - r).T.dot(inv(H.dot(V).dot(H.T))).dot(H.dot(beta) - r)
# 使用@运算符代替
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

很明显,最后一种实现更易于阅读和理解为一个方程。

需要澄清的是,根据您的第一个示例,我们可能会认为@已经为list实现了,但事实并非如此。@np.matmul相关联,而不是与np.dot相关联。这两者相似但并不相同。

0
0 Comments

在Python中,@操作符是用于矩阵乘法的。然而,没有Python内置类型实现了这个操作符。@操作符在Python 3.5中引入,@=是矩阵乘法后紧接着赋值的操作,和预期的一样。它们分别对应于__matmul__、__rmatmul__和__imatmul__,类似于+和+=对应于__add__、__radd__和__iadd__。关于该操作符以及其背后的原理在PEP 465中有详细的讨论。这也解释了为什么它在tokenizer.py的最新版本中存在,但在3.4文档中不存在。在Python 3.5的文档中有相关的介绍。对于Python装饰器有冲突吗?在Python 2.n中没有实现这个操作符。这并不会与装饰器冲突,因为装饰器永远不能在表达式之前出现,而二元操作符必须始终在表达式之前出现。

0