Подкласс Numpy Arrays: при использовании Resisize, как повторно приспособить вид на нарезанные детские массивыPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Подкласс Numpy Arrays: при использовании Resisize, как повторно приспособить вид на нарезанные детские массивы

Сообщение Anonymous »

Я пытаюсь создать буферный массив, который создает дополнительные индексы Numpy, чтобы я мог назначить, а не использовать такие функции, как np.append и где нарезанный массив «Дети» все еще может быть представлением от родителя. Мой код ниже может сделать это, но я также хочу включить функциональность, так что, когда Self.Resize () вызывается в родительский массив, это запустит обратный вызов, который отправит родителя обратно ребенку и «повторно приспосабливаться» к ребенку. Я попытался нарезать родителя на ребенка (child[:] = parent[child.idx:], но он ошибка ValueError: не может изменить размер этого массива: он не владеет своими данными
Есть ли это все равно?class BufferArray(np.ndarray):
GROWTH = 2
def __new__(cls, input_array):
base = np.asarray(input_array, dtype=float)
n = base.size
cap = max(1, 2 * n)
obj = super().__new__(cls, shape=(cap,), dtype=base.dtype)
obj[:n] = base
obj[n:] = np.nan
obj.n = n
return obj

def __array_finalize__(self, obj):
if obj is None:
return
self.n = getattr(obj, "n", 0)

def _grow(self):
old = self.size
self.resize(old * self.GROWTH, refcheck=False)
self[old:] = np.nan
if getattr(self, "mirror_callbacks", False):
if len(self.mirror_callbacks) > 0:
for callback in list(self.mirror_callbacks):
callback(self)

def update_value(self, value):
if self.n >= self.size:
self._grow()
self[self.n] = value
self.n += 1

def _attach_mirror(self, mirror):
print(f"\n_attach_mirror called")
print(f"parent id: {id(mirror)}")
print(f"child id before: {id(self)}")
#self._grow() # returns ValueError: cannot resize this array: it does not own its data
#self[:] = mirror[self.mirror_idx:] # returns ValueError: cannot resize this array: it does not own its data
self = mirror.create_mirror(self.mirror_idx)
print(f"child id after: {id(self)}")

def _add_mirror_callbacks(self, callback):
if not getattr(self, "mirror_callbacks", False):
self.mirror_callbacks=[callback]
else:
self.mirror_callbacks.append(callback)

def create_mirror(self, idx):
slice = self[idx:]
slice.mirror_idx = idx
self._add_mirror_callbacks(slice._attach_mirror)
return slice

parent = BufferArray(np.zeros(2, dtype=int))
child = parent.create_mirror(1)

print(f"parent id: {id(parent)}")
print(f"child id: {id(child)}")
print(f"parent: {parent}")
print(f"child: {child}")

print(f"\nlooping")
for i in range(1, 4):
parent.update_value(10*i)
print("\n")
print(f"parent: {parent}")
print(f"parent.n: {parent.n}")
print(f"child: {child}")
print(f"child.n: {child.n}")

print(f"\nfinal")
print(f"parent: {parent}")
print(f"child: {child}")


Подробнее здесь: https://stackoverflow.com/questions/796 ... -sliced-ch
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»