【问题标题】:Class iteration over internal numpy array ? Assignment?对内部 numpy 数组进行类迭代?任务?
【发布时间】:2020-06-30 00:16:59
【问题描述】:

如何让类通过其内部 numpy 数组进行迭代: 只是想法不起作用:

class ABC:

  def __init__(self):
     self.ary = np.zeros(50)

  def __iter__(self): return np.nditer(self.ary)
  def next(self): ...??..

还有如何让分配工作:

abc = ABC()
abc[5] = 12
abc[7:9] 0

【问题讨论】:

  • 你不需要定义next。您的课程应该可以工作,所以如果它不起作用,您需要具体说明什么不起作用。 “它不起作用”不是一个充分的问题描述。要使类可迭代,您需要定义__iter__。仅当您希望您的类成为 iterator 时才定义 __next__(注意,在 Python 3 中它是 __next__ 而不是 next),在这种情况下,__iter__ 必须返回self。我认为您不想定义迭代器,而是定义一个可迭代的。你有哪个。对于基于项目的分配,也请避免提出多个问题。
  • 不要使用nditer。正确使用太难了,而且没有任何速度优势。
  • 你希望用这门课做什么?您是否考虑过对list 进行子类化?
  • 这是干什么用的?

标签: python numpy class iterator assign


【解决方案1】:

来自文档,

iterator.__next__()

从容器中返回下一个项目。如果没有其他项目,则引发 StopIteration 异常。此方法对应 Python/C API 中 Python 对象的类型结构的 tp_iternext 槽。

对于容器类的settinggetting 值,您需要实现__getitem____setitem__

为您的示例代码

class ABC():
  def __init__(self):
     self.ary = np.zeros(50)
     self.index = self.ary.shape[0]

  def __iter__(self): 
     return np.nditer(self.ary)

  def next(self):
      if self.index == 0:
          raise StopIteration
      self.index = self.index - 1
      return self.data[self.index]

  def _check_indx(self, idx):
      if abs(idx) >= self.ary.shape[0]:
          raise IndexError(f"Invalid Index {idx} for array with shape {self.ary.shape}")

  def __setitem__(self, idx, value):
      self._check_indx(idx)
      self.ary[idx] = value

  def __getitem__(self, idx):
      self._check_indx(idx)
      return self.ary[idx]

【讨论】:

  • 为什么返回数组!! [i for i in t] Out[15]: [array(277, dtype=uint16), array(709, dtype=uint16), array(776, dtype=uint16), ....
  • @sten 这是因为 __iter__(self): 中的 return np.diter(self.ary),如果您打算将其用于一维数组,您可以将返回语句更改为 return iter(self.ary),这将给出预期的行为。因为,多维案例np.diter会是更好的选择
猜你喜欢
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多