Python中为numpy array动态添加vdot方法报错原因咨询
问题解答
错误原因
- 你尝试挂载方法的对象
np.array是用于生成numpy数组的内置工厂函数,并非numpy数组对应的类,就算你能成功给它加属性,也不会对实际生成的数组实例生效。 - 额外的:
np.array属于Python内置实现的函数对象,默认不允许动态添加自定义属性,这也是你执行赋值语句时直接抛出错误的直接原因。
而之前对np.matrix操作能生效的原因是:np.matrix本身就是矩阵实例对应的Python层面可修改的类,为类挂载方法会自动对所有该类的实例生效。
解决方法
将你挂载方法的代码修改为给numpy数组的实际类np.ndarray挂载即可:
def vdot(self, other): return np.sum(self@other, axis=0) # 正确写法:给ndarray类加方法 np.ndarray.vdot = vdot
修改后你原来的调用代码就可以正常运行,输出你预期的3倍2×2单位矩阵。
额外注意
- 这种直接修改内置类原型的方式存在兼容性风险,容易和其他库的自定义方法、numpy未来新增的内置方法产生命名冲突,非特殊场景更推荐直接调用独立的
vdot函数。 - 如果需要大量自定义数组方法,更稳妥的方案是子类化
np.ndarray实现自己的数组类,避免污染全局的numpy类。
内容的提问来源于stack exchange,提问作者Leviathan
相关产品推荐
相关产品推荐

