Python:具有相同方法集的子类。多次派遣

时间:2018-09-19 18:02:20

标签: python numpy scipy polymorphism

我正在编写一个类,该类具有可用于numpy数组和scipy.sparse矩阵的预期方法。然后,我意识到我所有的方法都以if语句开头,以检查基础矩阵是密集还是稀疏,例如。

def standardize_columns(self):
    if self.issparse():
        …
    else:
        …

def multiply_by_diagonal_matrix(self, diag_vector, from_='right'):
    if self.issparse():
        …
    else:
        …

到处都有这样的if-else语句似乎有些愚蠢(不是pythonic)。到目前为止,我已经找到了两种可能的解决方法:1.使用预定的方法集创建一个抽象类并创建子类(enter image description herehttps://pythonspot.com/polymorphism/),或2.使用以下方法创建一组函数多次发送(https://docs.python.org/3/library/abc.html)。

这两种方法(或其他方法)中哪个更好,为什么?

1 个答案:

答案 0 :(得分:1)

这比回答要长得多。

  • 子类化numpy.ndarray并不是一件容易的事。

  • scipy.sparse格式已经实现为类-几个不同的类;没有一个是ndarray的子类。

  • 稀疏矩阵的行为以numpy.matrix子类为模型-始终为2d,*为矩阵乘法。

  • numpy函数可以在稀疏矩阵(如果是)上运行,它们委托方法的操作。换句话说,如果存在同名的稀疏和密集方法,则通常可以使用该方法或使用它的函数来获得。这是Python的鸭嘴式。

  • scikit-learn有很多接受稀疏和密集代码的代码。也许值得研究一下它是如何处理的。我知道他们添加了一些实用程序代码,包括一些更快的cython东西,以加快选定的稀疏操作的速度。

  • sparse.linalg具有线性运算符的概念,它仅要求对象具有特定的矩阵*矢量`乘法。

  • 在使用稀疏矩阵进行处理时,请确保您了解所生成的内容。有时稀疏格式会更改。有时结果是np.matrixnp.ndarray

在没有更多功能细节的情况下,将很难提出更系统的方法。