2017-02-01 2 views
3

Может кто-нибудь предложить эффективный метод для получения наибольшего значения в одном столбце для каждого уникального значения в другомNumPy питона: Найти наибольшее значение из столбца для каждого уникального значения в другом столбце

np.array выглядит это [column0, column1, column2, колонка3]

[[ 37367 421 231385  93] 
[ 37368 428 235156  93] 
[ 37369 408 234251  93] 
[ 37372 403 196292  93] 
[ 55523 400 247141 139] 
[ 55575 415 215818 139] 
[ 55576 402 204404 139] 
[ 69940 402 62244  175] 
[ 69941 402 38274  175] 
[ 69942 404 55171  175] 
[ 69943 416 55495  175] 
[ 69944 407 90231  175] 
[ 69945 411 75382  175] 
[ 69948 405 119129 175]] 

, где я хочу, чтобы вернуть максимальное значение столбца 1 на основе уникального значения столбца 3. После нового массива должен выглядеть следующим образом:

[[ 37368 428 235156  93] 
[ 55575 415 215818 139] 
[ 69943 416 55495 175]] 

Я знаю, как сделать это с помощью цикла, но это не то, что я ищу после того, как из-за стола я работаю в довольно большой и я хочу, чтобы избежать зацикливания

ответ

3

Вот один подход -

# Lex-sort combining cols-1,3 with col-3 setting the primary order 
sidx = np.lexsort(a[:,[1,3]].T) 

# Indices at intervals change for column-3. These would essentially 
# tell us the last indices for each group in a lex-sorted array 
idx = np.append(np.flatnonzero(a[1:,3] > a[:-1,3]), a.shape[0]-1)  

# Finally, index into idx with lex-sorted indices to give us 
# the last indices in a lex-sorted version, which is equivalent 
# of picking up the highest of each group 
out = a[sidx[idx]] 

Пример запуска -

In [234]: a # Input array 
Out[234]: 
array([[ 25, 29, 19, 93], 
     [ 27, 59, 14, 93], 
     [ 24, 46, 15, 93], 
     [ 79, 87, 50, 139], 
     [ 13, 86, 32, 139], 
     [ 56, 25, 85, 142], 
     [ 62, 62, 68, 142], 
     [ 27, 25, 20, 150], 
     [ 29, 53, 71, 150], 
     [ 64, 67, 21, 150], 
     [ 96, 57, 73, 150]]) 

In [235]: out # Output array 
Out[235]: 
array([[ 27, 59, 14, 93], 
     [ 79, 87, 50, 139], 
     [ 62, 62, 68, 142], 
     [ 64, 67, 21, 150]]) 

повышение производительности с видом

Мы можем С.Л. лед с a[:,1::2] вместо a[:,[1,3]], чтобы использовать то же пространство памяти и, следовательно, мы надеемся также повысить производительность. Давайте проверим вид памяти -

In [240]: np.may_share_memory(a,a[:,[1,3]]) 
Out[240]: False 

In [241]: np.may_share_memory(a,a[:,1::2]) 
Out[241]: True 
+0

Вау, этот метод - именно тот тип, который я получил после. Еще раз спасибо @ Дивакар. Я очень ценю вашу преданность делу. Вы очень быстро ответили на многие мои вопросы о новинках – RaduS

Смежные вопросы

 Смежные вопросы