2017-02-01 18 views
3

Kann jemand eine effiziente Methode vorschlagen, den höchsten Wert in einer Spalte für jeden eindeutigen Wert in einem anderennumpy Python: Hier finden Sie den höchsten Wert aus einer Spalte für jeden eindeutigen Wert in einer anderen Spalte

für das Erhalten der np.array aussieht diese [column0, column1, column2, column3]

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

, wo ich den höchsten Wert der Spalte 1 basiert auf der einzigartigen Wert der Spalte 3. nach dem neuen Array zurückkehren möchte, sollte wie folgt aussehen:

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

Ich weiß, wie dies zu tun, indem Looping, aber das ist nicht das, was ich nach bin auf der Suche, weil die Tabelle i in der Arbeit bin ziemlich groß und ich will

Antwort

3

Hier vermeiden Looping ist ein Ansatz -

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

Probelauf -

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

Leistungsschub mit Blick

Wir sl können Eis mit statt a[:,[1,3]] den gleichen Speicherplatz zu nutzen und damit hoffentlich auch Leistungsverbesserungen herauszuholen. Lassen Sie uns die Speicheransicht überprüfen -

+0

wow, diese Methode ist genau der Typ, nach dem ich war. Nochmals vielen Dank @Divakar Ich schätze Ihre Hingabe für die Hilfe. Du hast auf viele meiner neuen Fragen wirklich schnell geantwortet – RaduS

Verwandte Themen