如何根据字符串名称将向量附加到 numpy 矩阵?

How to append vector to numpy matrix based on its string name?

我有许多 numpy 数组的异步进程,它们的新值是任意出现的,需要附加。我为此苦苦挣扎了几个小时,想得到这样的东西:

class nbAppend():
    def __init__(self):
         pass

    def append(self,varName,varValues):
          self.varName = np.append(self.varName,varValues,axis=0) # !!! not feasible

所以当一个 numpy 数组 x 出现新值时,它应该在 'x' = np.append('x',values,axis=0) 中更新。我知道有字典的解决方案,即

np_add_rows = {}
def process_row(d, key,_cache=np_add_rows):
    # keep the rows for each key separate.
    lst = _cache.setdefault(key, [])
    lst.append(d)

但是这种解决方法会使代码速度降低 5-6 倍,这是不可接受的。那么,如何根据字符串名称将向量附加到 numpy 矩阵?感谢您的帮助。

在字典中收集数组:

collections.defaultdict:

In [85]: dd = defaultdict(lambda : np.zeros(0, int))                                                 
In [86]: for i in ['aa','bb','cc','dd','aa','cc']: 
    ...:     dd[i] = np.concatenate([dd[i], np.arange(3)]) 
    ...:                                                                                             
In [87]: dd                                                                                          
Out[87]: 
defaultdict(<function __main__.<lambda>()>,
            {'aa': array([0, 1, 2, 0, 1, 2]),
             'bb': array([0, 1, 2]),
             'cc': array([0, 1, 2, 0, 1, 2]),
             'dd': array([0, 1, 2])})

或使用常规字典:

In [88]: dd = {}                                                                                     
In [89]: for i in ['aa','bb','cc','dd','aa','cc']: 
    ...:     arr = dd.get(i, np.zeros(0,int)) 
    ...:     dd[i] = np.concatenate([arr, np.arange(3)]) 
    ...:      
    ...:                                                                                             
In [90]: dd                                                                                          
Out[90]: 
{'aa': array([0, 1, 2, 0, 1, 2]),
 'bb': array([0, 1, 2]),
 'cc': array([0, 1, 2, 0, 1, 2]),
 'dd': array([0, 1, 2])}

等价列表:

In [93]: dd = defaultdict(list)                                                                      
In [94]: for i in ['aa','bb','cc','dd','aa','cc']: 
    ...:     dd[i].extend(np.arange(3)) 
    ...:                                                                                             
In [95]: dd                                                                                          
Out[95]: 
defaultdict(list,
            {'aa': [0, 1, 2, 0, 1, 2],
             'bb': [0, 1, 2],
             'cc': [0, 1, 2, 0, 1, 2],
             'dd': [0, 1, 2]})

通常这个列表版本会更快,但如果在每次迭代中我们都必须做类似

的事情
acc.append(np.sum(dd[i])) 

它可以使时间有利于数组累加,因为它可以节省从列表到数组的重复转换。