原始问题描述
当我用 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/