Python: Как создать объект с расширяемыми numpy членами массива - PullRequest
0 голосов
/ 20 января 2020

У меня есть следующий вариант использования:

  1. Я получаю 100 выборок в секунду из нескольких numpy nd-массивов, скажем a формы (4, 3) и b формы (5, 6).

  2. В других случаях я мог бы получить c формы (2, 3) и d формы (3, 5) и e другой формы и т. д.

  3. Эти образцы поступают в течение некоторого переменного времени между одним образцом и 360000 образцами (час).

  4. Я хотел бы обработать весь сеанс потоковой передачи как объект


Я хотел бы иметь что-то вроде

class Aggregator_ab(object):
    def __init__(self):
        self.a = ???
        self.b = ???

    def add_sample(new_a, new_b):
        self.a.update(new_a)  # How can I achieve such an update?
        self.b.update(new_b)  # How can I achieve such an update?

Теперь я хотел бы

получить доступ к полям Aggregator_ab как numpy массивы:

agg = Aggregator_ab()  # maybe with parameters?

num_samples = 4

for i in range(num_samples):
    agg.add_sample(new_a=np.zeros((4, 3), new_b=np.zeros((5, 6))

assert agg.a.shape[0] == num_samples 
assert agg.b.shape[0] == num_samples 
assert agg.a.shape[1:] == (4, 3)
assert agg.b.shape[1:] == (5, 6)

И я также ожидал бы регулярного numpy поведения членов agg.


Мой текущий код имеет некоторые проблемы и выглядит примерно так:

class Aggregator_ab(object):
    def __init__(self):
        self.__as = []
        self.__bs = []

    def add_sample(new_a, new_b):
        self.__as.append(new_a)
        self.__bs.append(new_b)

    @property
    def a(self):
        return np.vstack(self.__as)

    @property
    def b(self):
        return np.vstack(self.__bs)

проблемы:

  1. может получить только "полный "numpy массив после использования vstack
  2. должен использовать дорогой vstack каждый "получить"
  3. не может использовать предыдущий vstacks
  4. добавление любого поля требует большого количества шаблонов, которые я хотел бы extract
  5. Это поддерживает только очень ограниченные варианты использования, и если я когда-либо захочу чего-то большего, мне придется реализовать себя.
  6. просмотр собственных списков python - единственный способ масштабирования размер массива, не платя слишком много за изменение размера. Если бы я использовал vstack для хранения массива numpy в больших размерах, я бы не справился с частотой кадров.

Это кажется мне обычным делом случай, поэтому я считаю, что кто-то решил это до меня.

Есть ли какая-нибудь библиотека, которая делает это? Я знаю, pandas звучит правильно, но что мне делать, если у меня есть поля, которые такое матрицы?

Если нет, то как с этим обычно справляются?

1 Ответ

0 голосов
/ 20 января 2020

Как насчет выделения массива, размер которого постоянно увеличивается? Он работает как векторы в большинстве распространенных языков:

import numpy as np
class growing_array:
    def __init__(self, shape, growth):
        self._arr=np.empty(shape=(*shape, growth))
        self.incoming_shape=shape
        self.num_entries=0
        self.growth=growth

    def append(self, incoming_arr):
        if self.num_entries == self._arr.shape[2]:
            self._arr.resize(*self.incoming_shape, self._arr.shape[2]+self.growth)
        self._arr[:,:,self.num_entries] = incoming_arr
        self.num_entries+=1

    def get(self):
        return self._arr[:,:,0:self.num_entries]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...