【发布时间】:2022-01-08 22:45:55
【问题描述】:
我遇到了以下代码的问题
def vdot(self, other):
return np.sum(self@other, axis=0)
np.array.vdot = vdot
这段代码应该允许我将 vdot 函数用作
a=np.matrix('1 0; 0 1')
V=np.array([a,a,a])
print(V.vdot(V))
这应该给我一个 2x2 矩阵,它只是单位矩阵的 3 倍。代码应该只乘以具有矩阵作为条目的向量。但是,如果我尝试使用 np.array.vdot = vdot 定义此函数,它会给我一条错误消息“'builtin_function_or_method' 对象没有属性'vdot'”。另一方面,这对矩阵非常有效,请参阅Add method to numpy object
请注意,使用 vdot 作为 vdot(array, array) 效果很好。
为什么这不适用于数组?似乎与矩阵情况没有什么不同。
提前致谢:)
【问题讨论】:
-
您确定不是因为您没有使用 V 的转置,例如:V.vdot(V.T) 吗?
-
嗨,不。甚至无法定义函数。 “np.array.vdot = vdot”这一行给出了一个错误,意思是,在我开始使用它之前。此外,代码无需转置向量即可工作。
-
np.array是函数。您不能向函数添加属性或方法。 -
type(np.matrix)给出<class 'type'>但type(np.array)给出<class 'builtin_function_or_method'>。有 ndarray 和type(ndarray)也给出了<class 'type'>但如果你尝试分配函数,那么它会显示built-in/extension type 'numpy.ndarray'并且它可能意味着 C/C++ 中的代码,它不能有这样的扩展。 -
np.matrix是用python编写的子类定义。因此它有一个__dict__,并且可以像你一样采用其他方法。np.array是一个编译函数,它返回一个ndarray对象。ndarray类的代码都是编译好的,没有这个目录,所以不能给numpy数组添加方法或属性。 numpy.matrixlib.defmatrix.py` 是matrix源代码。