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 =
(4,3)
的a
,形状(5,6)
的b
(2,3)
的c
,以及形状(3,5)
的d
和其他形状的e
,等等我想要点像这样的
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
在我看来,这似乎是一个常见的用例,因此我相信有人在我之前解决了这个问题 有没有这样的库?我知道熊猫听起来不错,但如果我有矩阵字段,我该怎么办
如果没有,那么通常是如何处理的?如何分配一个不断增长的数组?它的工作原理类似于大多数常见语言中的向量:
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毫秒