Python:如何用最少的代码扩展一个巨大的类?

标签 python arrays class inheritance numpy

原始问题描述

当我用 numpy 实现一些机器学习算法时出现问题.我想要一些新类(class) ludmo的作用相同numpy.ndarray ,但还有更多属性。例如,使用新属性 ludmo.foo .我尝试了以下几种方法,但没有一种是令人满意的。

1。包装器

首先,我为 numpy.ndarray 创建了一个包装类, 作为

import numpy as np

class ludmo(object):
    def __init__(self)
        self.foo = None
        self.data = np.array([])

但是当我使用某些函数(在我无法修改的 scikit-learn 中)来操作 np.ndarray 的列表时例如,我必须先提取所有 data每个字段 ludmo对象并将它们收集到列表中。之后列表被排序,我丢失了 data 之间的对应关系。和原创ludmo对象。

2。继承

然后我尝试制作 ludmo numpy.ndarray 的子类, 作为

import numpy as np

class ludmo(np.ndarray):
    def __init__(self, shape, dtype=float, buffer=None, offset=0, strides=None, order=None)
        super().__init__(shape, dtype, buffer, offset, strides, order)
        self.foo = None

但是另一个问题出现了:创建 numpy.ndarray 的最常见方法对象是 numpy.array(some_list) ,它返回一个 numpy.ndarray对象,我必须将其转换为 ludmo目的。但是直到现在我还没有找到好的方法来做到这一点;只需更改 __class__属性将导致错误。

我是 Python 和 numpy 的新手,所以一定有一些我不知道的优雅方式。任何建议表示赞赏。

谁能给出一个通用的解决方案就更好了,不仅适用于numpy.ndarray类还有各种类。

最佳答案

作为explained in the docs你可以将你自己的方法添加到 np.ndarray 做:

import numpy as np

class Ludmo(np.ndarray): 
    def sumcols(self):
        return self.sum(axis=1)

    def sumrows(self):
        return self.sum(axis=0)

    def randomize(self):
        self[:] = np.random.rand(*self.shape)

然后使用 the np.ndarray.view() method 创建实例:

a = np.random.rand(4,5).view(Ludmo)

并使用__array_finalize__()方法定义新的属性:

def __array_finalize__(self, arr):
    self.foo = 'foo'

关于Python:如何用最少的代码扩展一个巨大的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28804526/

相关文章:

arrays - 在 swift 4 中从数组中过滤/平面映射出具有任何 nil 值的对象

java - 我想创建一个运算符来除以 Problem1 : ("+6x" ,"2"), get ("+3x");问题2 : ("12" ,"2"), 得到("6")。

python - 为什么 python 必须生成完整的范围来测试是否在范围内 float ?

python - "Friend"在 python 中学习类

Python Pandas : Merge or Filter DataFrame by Another. 有没有更好的方法?

arrays - 从函数返回对象数组 - VBA

Java内置类到接口(interface)

Java - 通过对象数组调用扩展类中的函数

c#静态类和非静态类有什么区别(我说的是类本身不是字段)

python - SQLAlchemy - 模型 - 使用动态字段 - ActiveRecord