如何根据字符串名称将向量附加到 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]))
它可以使时间有利于数组累加,因为它可以节省从列表到数组的重复转换。
我有许多 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]))
它可以使时间有利于数组累加,因为它可以节省从列表到数组的重复转换。