2014-07-11 1 views
2

J'ai un vecteur d'entiers non consécutifs que j'ai besoin d'utiliser comme indices pour une matrice. Afin de créer une matrice de taille minimale, je veux réétiqueter les entrées du vecteur de la manière suivante:Julia. Ré-étiqueter un vecteur

input = [794, 421, 496, 158, 421, 794, 794, 656, 108, 496, 496, 687, 108, 511, 108, 108, 158, 687, 158, 687] 
output = [1, 2, 3, 4, 2, 1, 1, 5, 6, 3, 3, 7, 6, 8, 6, 6, 4, 7, 4, 7] 

Voici un exemple de la façon dont je le fais dans Mathematica:

labels = DeleteDuplicates[input] 
output = Flatten[Position[labels, #] & /@ input] 

Quelle est et manière efficace de le faire dans Julia?

Merci, keyan

+1

Jetez un oeil à [ 'unique'] (http://docs.julialang.org/en/latest/stdlib/base/# Base.unique) et ['indexin'] (http://docs.julialang.org/en/latest/stdlib/base/#Base.indexin). –

+1

Juste, et trouvé la solution: relabel (v :: Vector {Int64}) = findin (v, unique (v)). Merci – Keyan

+0

en fait, un bug/une mauvaise description de findin rend cette solution temporairement problématique. utilisez 'indexin' à la place. –

Répondre

2

La solution est

relabel(v::Vector{Int64}) = indexin(v, unique(v))