You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NumPy是如何添加@运算符的?能否为Python 3自定义新运算符?

问题解答

NumPy中@运算符的实现方式

@是Python官方引入的矩阵乘法专用运算符,NumPy对它的支持是通过实现三个特殊方法来完成的:

  • __matmul__(self, other):处理self @ other的正向运算
  • __rmatmul__(self, other):当左操作数不支持@时,兜底处理other @ self的反向运算
  • __imatmul__(self, other):处理self @= other的原地矩阵乘法

举个极简的自定义类示例,你就能明白这个逻辑:

class SimpleMatrix:
    def __init__(self, values):
        self.values = values
    
    def __matmul__(self, other):
        # 简化的二维矩阵乘法实现
        rows_self = len(self.values)
        cols_other = len(other.values[0])
        result = [[0]*cols_other for _ in range(rows_self)]
        for i in range(rows_self):
            for j in range(cols_other):
                result[i][j] = sum(self.values[i][k] * other.values[k][j] for k in range(len(other.values)))
        return SimpleMatrix(result)

# 测试代码
m1 = SimpleMatrix([[1, 2], [3, 4]])
m2 = SimpleMatrix([[5, 6], [7, 8]])
print((m1 @ m2).values)  # 输出 [[19, 22], [43, 50]]

NumPy的ndarray类就是基于这套机制,在底层用C实现了高效的矩阵乘法逻辑,所以运算速度远高于纯Python实现。

Python 3能否自定义新运算符

Python 3不允许直接新增全新的运算符——所有运算符都是Python语法规范里硬编码的,比如+、*、@这些,你没法自己加一个比如$或者&%这类不在规范里的新运算符。

不过你可以重载现有运算符的行为,比如通过__add__()修改+的作用,或者像上面那样用__matmul__()实现@的逻辑,但这只是修改已有运算符的功能,不是创造新的。

如果确实需要类似“新运算符”的功能,通常的替代方案是定义普通函数或方法,比如用matrix_mult(a, b)来模拟,或者用特殊命名的方法调用,但这和真正的运算符在语法简洁性上没法比。

内容的提问来源于stack exchange,提问作者Quinten C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 15:27:12