@= 在 Python 中是一个赋值运算符,用于将右侧的值赋给左侧的变量。
在Python3.5中引入了一个新的运算符@,用于矩阵乘法。这个运算符的具体说明可以在Python官方文档中的PEP 465中找到。下面是一个示例代码:
C = A @ B
这个运算符的引入是为了简化矩阵乘法的操作,使得代码更加简洁和易读。使用@运算符可以直接进行矩阵乘法,而不需要使用额外的函数或方法。
如果你在Python3.5或更高版本中使用了@运算符,但是遇到了问题,可以考虑以下几个解决方法:
1. 确认Python版本:首先要确保自己使用的是Python3.5或更高版本。如果你使用的是较旧的Python版本,则无法使用@运算符。
2. 检查语法错误:如果你的代码中出现了语法错误,可能会导致@运算符无法正常工作。请仔细检查代码中的拼写错误、缩进错误等问题。
3. 检查变量类型:在进行矩阵乘法运算之前,需要确保参与运算的变量是合法的矩阵类型。如果变量不是矩阵类型,可能会导致@运算符无法正常工作。
希望以上内容对于理解@运算符的引入原因和解决相关问题有所帮助。如果你想了解更多关于@运算符的信息,可以参考Python官方文档中的相关章节。
在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
相关联。这两者相似但并不相同。
在Python中,@操作符是用于矩阵乘法的。然而,没有Python内置类型实现了这个操作符。@操作符在Python 3.5中引入,@=是矩阵乘法后紧接着赋值的操作,和预期的一样。它们分别对应于__matmul__、__rmatmul__和__imatmul__,类似于+和+=对应于__add__、__radd__和__iadd__。关于该操作符以及其背后的原理在PEP 465中有详细的讨论。这也解释了为什么它在tokenizer.py的最新版本中存在,但在3.4文档中不存在。在Python 3.5的文档中有相关的介绍。对于Python装饰器有冲突吗?在Python 2.n中没有实现这个操作符。这并不会与装饰器冲突,因为装饰器永远不能在表达式之前出现,而二元操作符必须始终在表达式之前出现。