2016-07-21 7 views
1

Ich mag einen zusammenhängenden Bereich 0 ... n, wie dies beliebige ganze Zahlen in einem numpy Array übersetzen:Übersetzen ganze Zahlen in einem numpy Array in einen zusammenhängenden Bereich 0 ... n

source: [2 3 4 5 4 3] 
translating [2 3 4 5] -> [0 1 2 3] 
target: [0 1 2 3 2 1] 

Es muss ein besserer Weg sein, als das Folgende:

import numpy as np 

"translate arbitrary integers in the source array to contiguous range 0...n" 

def translate_ids(source, source_ids, target_ids): 
    target = source.copy() 

    for i in range(len(source_ids)): 
     x = source_ids[i] 
     x_i = source == x 
     target[x_i] = target_ids[i] 

    return target 

# 

source = np.array([ 2, 3, 4, 5, 4, 3 ]) 
source_ids = np.unique(source) 
target_ids = np.arange(len(source_ids)) 

target = translate_ids(source, source_ids, target_ids) 

print "source:", source 
print "translating", source_ids, '->', target_ids 
print "target:", target 

Was ist das?

Antwort

4

IIUC Sie können einfach np.unique ‚s optionales Argument return_inverse, wie so verwenden -

np.unique(source,return_inverse=True)[1] 

Probelauf -

In [44]: source 
Out[44]: array([2, 3, 4, 5, 4, 3]) 

In [45]: np.unique(source,return_inverse=True)[1] 
Out[45]: array([0, 1, 2, 3, 2, 1]) 
1

pandas.factorize ist eine Methode:

import pandas as pd 

lst = [2, 3, 4, 5, 4, 3] 
res = pd.factorize(lst, sort=True)[0] 

# [0 1 2 3 2 1] 

Hinweis: diese re dreht eine Liste, während np.unique immer eine np.ndarray zurückgibt.

Verwandte Themen