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

2024-06-28 20:04:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多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个新值时,它应该在sence'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-6x的代码速度,这是不可接受的。那么,如何根据向量的字符串名称将向量附加到numpy矩阵?谢谢你的帮助


Tags: keyselfnumpyaddcachedefnp数组
1条回答
网友
1楼 · 发布于 2024-06-28 20:04:56

在字典中收集数组:

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])) 

它可以将计时倾斜到有利于数组累积的位置,因为这样可以节省从列表到数组的重复转换

相关问题 更多 >