2016-06-24 3 views
5

Есть ли какая-либо функция в numpy для группировки этого массива ниже в первом столбце?Есть ли группа numpy по функции?

я не мог найти хороший ответ через интернет ..

>>> a 
array([[ 1, 275], 
     [ 1, 441], 
     [ 1, 494], 
     [ 1, 593], 
     [ 2, 679], 
     [ 2, 533], 
     [ 2, 686], 
     [ 3, 559], 
     [ 3, 219], 
     [ 3, 455], 
     [ 4, 605], 
     [ 4, 468], 
     [ 4, 692], 
     [ 4, 613]]) 

Wanted выход:

array([[[275, 441, 494, 593]], 
     [[679, 533, 686]], 
     [[559, 219, 455]], 
     [[605, 468, 692, 613]]], dtype=object) 
+0

Я думаю, вы имели в виду массив списков, а не списки списков? –

+1

как насчет решения pandas? – MaxU

ответ

3
n = unique(a[:,0]) 
array([ list(a[a[:,0]==i,1]) for i in n]) 

выходы:

array([[275, 441, 494, 593], [679, 533, 686], [559, 219, 455], 
     [605, 468, 692, 613]], dtype=object) 
+1

, чтобы иметь точно такой же ответ, как он хочет 'array ([[x] для x в [list (a [a [,, 0] == i, 1]) для i в n]])' – efirvida

+0

yes, ваше решение возвращает то, что он просил. Но я просто предположил, что он действительно хотел массив списков и не бесполезный массив списков списков, содержащих один элемент – Gioelelm

+0

hahaha, я знаю! – efirvida

4

numpy_indexed пакет (отказ от ответственности: я его aut hor) стремится заполнить этот пробел в numpy. Все операции с индексированием numpy полностью векторизованы, и при создании этой библиотеки не пострадали никакие алгоритмы O (n^2).

import numpy_indexed as npi 
npi.group_by(a[:, 0]).split(a[:, 1]) 

Обратите внимание, что, как правило, более эффективно непосредственно вычислять соответствующие свойства по сравнению с такими группами (т.е. group_by (ключи) .mean (значения)), а не первого расщеплению на список/зазубренный массив.

0

Вдохновленный библиотекой Eelco Hoogendoorn, но без его библиотеки и с использованием того факта, что первый столбец вашего массива всегда увеличивается.

>>> np.split(a[:, 1], np.cumsum(np.unique(a[:, 0], return_counts=True)[1])[:-1]) 
[array([275, 441, 494, 593]), 
array([679, 533, 686]), 
array([559, 219, 455]), 
array([605, 468, 692, 613])] 

Я не сделал «timeit», но это, вероятно, более быстрый способ для достижения вопрос:

  • Нет питона родной цикл
  • списки результирующих Numpy массивы, в случае, если вам нужно делают другие Numpy операции над ними, никакие новые преобразования не будут нужны
  • Сложность как O (N)

PS: Я написал аналогичная строка, потому что мне нужно было «группировать по» результаты np.nonzero:

>>> indexes, values = np.nonzero(...) 
>>> np.split(values, np.cumsum(np.unique(indexes, return_counts=True)[1])) 
Смежные вопросы