Итерация класса по внутреннему массиву numpy? Назначение? - PullRequest
0 голосов
/ 19 марта 2020

Как сделать так, чтобы класс повторялся по его внутреннему массиву 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

1 Ответ

1 голос
/ 19 марта 2020

Из документации

итератор .__ следующий __ () :

Возврат следующего элемента из контейнера. Если больше нет предметов, вызовите исключение StopIteration. Этот метод соответствует слоту tp_iternext структуры типа для объектов Python в API Python / C.

Для значений setting и getting для класса контейнера необходимо внедрить __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]
...