【问题标题】:How should a class that inherits from NumPy ndarray and has a default value be created?应该如何创建一个继承自 NumPy ndarray 并具有默认值的类?
【发布时间】:2014-12-18 22:45:30
【问题描述】:

我想创建一个从 NumPy ndarray 继承的类,并且我想以这样一种方式做到这一点,即我不需要在实例化时为数组提供值,但可以让它默认为某个值。我很难让它工作:

import numpy

class Variable(numpy.ndarray):

    def __init__(
        self,
        name                    = "trk_pt",
        tree                    = None, # tree object
        eventNumber             = None,
        eventWeight             = None,
        numberOfBins            = None, # binning
        binningLogicSystem      = None, # binning
        ):
        # arguments
        self._name              = name
        self.tree               = tree
        self.eventNumber        = eventNumber
        self.eventWeight        = eventWeight
        self.numberOfBins       = numberOfBins
        self.binningLogicSystem = binningLogicSystem
        # internal
        self.variableObject     = None
        self.variableType       = None
        self.dataType           = None
        self.variableDataTypes  = None
        self.canvas             = None
        self.histogram          = None
        self._values            = [] # list of values
        self._valuesRaw         = [] # list of unmodified, raw values
        # NumPy ndarray inheritance
        #self = ([1])
        if sys.version_info >= (3, 0):
            super().__init__([1])
        else:
            super(numpy.ndarray, self).__init__([1])

a = Variable()

我遇到的错误如下:

TypeError: Required argument 'shape' (pos 1) not found

如何编写代码,使数组在实例化时具有默认值并且不需要值?

【问题讨论】:

  • 您可能想使用__new__,而不是__init__。不过好久没用了,所以恐怕我不记得你应该在这里做什么了。
  • 你检查过this吗?子类化 ndarray 与常规的 python 类没有什么不同。
  • super(Variable, self).__init__super 的正确 v2 用法。
  • 您计划对新班级采取哪些array 行动?将一个变量添加到另一个变量?您将如何设置新变量的.tree 属性?

标签: python arrays inheritance numpy instantiation


【解决方案1】:

使用this example from the docs as a guide,你可以使用

    self = np.asarray([1]).view(cls)

__new__中实例化数组:

import numpy as np

class Variable(np.ndarray):

    def __new__(
        cls,
        name                    = "trk_pt",
        tree                    = None, # tree object
        eventNumber             = None,
        eventWeight             = None,
        numberOfBins            = None, # binning
        binningLogicSystem      = None, # binning
        ):
        self = np.asarray([1]).view(cls)
        self._name              = name
        self.tree               = tree
        self.eventNumber        = eventNumber
        self.eventWeight        = eventWeight
        self.numberOfBins       = numberOfBins
        self.binningLogicSystem = binningLogicSystem
        ...
        return self

a = Variable()

还要注意help(np.ndarray)

不需要__init__ 方法,因为数组已完全 在__new__ 方法之后初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多