defaultdict
делает этот вид коллекции легко:
In [268]: from collections import defaultdict
In [269]: x = [[1,1],[2,2],[3,3],[4,4],[5,5]]
In [270]: y = [2,3,2,3,4]
In [271]: dd = defaultdict(list)
In [272]: for i,j in zip(y, x):
...: dd[i].append(j)
...:
In [273]: dd
Out[273]: defaultdict(list, {2: [[1, 1], [3, 3]], 3: [[2, 2], [4, 4]], 4: [[5, 5]]})
Если результатом должен быть массив, а не список, его можно преобразовать с помощью:
In [274]: d = {k: np.array(dd[k]) for k in dd}
In [275]: d
Out[275]:
{2: array([[1, 1],
[3, 3]]), 3: array([[2, 2],
[4, 4]]), 4: array([[5, 5]])}
Добавление списка быстрее, чем np.append
(или любая из функций семейства numpy
concatenate
). Добавление списка работает на месте.
defaultdict
может создать массив напрямую (но я ожидаю, что это будет медленнее):
In [280]: dd = defaultdict(lambda:np.zeros((0,2),int))
In [281]: for i,j in zip(y, x):
...: dd[i] = np.vstack((dd[i],j))
...:
In [282]: dd
Out[282]:
defaultdict(<function __main__.<lambda>()>, {2: array([[1, 1],
[3, 3]]), 3: array([[2, 2],
[4, 4]]), 4: array([[5, 5]])})