【问题标题】:Dynamic Method Addition Python Array动态方法添加 Python 数组
【发布时间】: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 源代码。

标签: python numpy


【解决方案1】:

您要查找的课程是np.ndarraynp.array 只是一个有助于实例化 ndarray 的函数。但正如您将看到的,如果您尝试对 np.ndarray 进行修补,这是不可能的。据我了解,这是因为 ndarray 类型是用 C 编写和编译的,其行为类似于内置。

【讨论】:

  • 你好@sunnytown。我知道了。再次感谢!
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多