Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何创建具有可扩展numpy数组成员的对象_Python_Arrays_Numpy - Fatal编程技术网

Python:如何创建具有可扩展numpy数组成员的对象

Python:如何创建具有可扩展numpy数组成员的对象,python,arrays,numpy,Python,Arrays,Numpy,我有以下用例: 我每秒收到100个numpy nd阵列的样本,比如形状(4,3)的a,形状(5,6)的b 在其他情况下,我可以接收形状(2,3)的c,以及形状(3,5)的d和其他形状的e,等等 这些样品在单个样品和360000个样品(一小时)之间的可变时间内到达 我想将整个流媒体会话视为一个对象 我想要点像这样的 class Aggregator_ab(object): def __init__(self): self.a = ??? self.b =

我有以下用例:

  • 我每秒收到100个numpy nd阵列的样本,比如形状
    (4,3)
    a
    ,形状
    (5,6)
    b

  • 在其他情况下,我可以接收形状
    (2,3)
    c
    ,以及形状
    (3,5)
    d
    和其他形状的
    e
    ,等等

  • 这些样品在单个样品和360000个样品(一小时)之间的可变时间内到达

  • 我想将整个流媒体会话视为一个对象


  • 我想要点像这样的

    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?
    
    现在,我想

    以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)
    
    我还希望
    agg
    的成员有规律的numpy行为


    我当前的代码有一些问题,看起来像:

    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)
    
    问题:

  • 使用
    vstack
  • 每次“获取”都必须使用昂贵的
    vstack
  • 无法使用以前的
    vstack
  • 添加任何字段都需要大量我想提取的样板文件
  • 这只支持非常有限的用例,如果我想要更多的东西,我必须自己实现
  • 查看本机python列表是扩展数组大小而不必为调整大小付出太多代价的唯一方法。如果我使用vstack来保持大尺寸的numpy阵列,我将无法跟上帧速率

  • 在我看来,这似乎是一个常见的用例,因此我相信有人在我之前解决了这个问题

    有没有这样的库?我知道熊猫听起来不错,但如果我有矩阵字段,我该怎么办


    如果没有,那么通常是如何处理的?

    如何分配一个不断增长的数组?它的工作原理类似于大多数常见语言中的向量:

    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]
    

    这将导致每次更新(每秒100次)30000多个元素拷贝(更不用说重新分配了)。这是不可行的,如果您将growth设置为例如1000,则不会在每个append上重新定位,并且在我的机器(标准台式pc)上,使用另一个阵列的切片,每个append上只有2x3所以6个元素副本使用growth=1000时,10E6个appends大约需要800毫秒